1

我构建了一个 WSSv3 应用程序,它以小块上传文件;当每个数据块到达时,出于性能原因,我暂时将其保存在 SQL 2005 图像数据类型字段中**。

上传结束时出现问题;我需要通过 WSSv3 对象模型将数据从我的 SQL Server 移动到 Sharepoint 文档库。

现在,我可以想到两种方法:

SPFileCollection.Add(string, (byte[])reader[0]); // OutOfMemoryException

SPFile file = folder.Files.Add("filename", new byte[]{ });
using(Stream stream = file.OpenBinaryStream())
{
    // ... init vars and stuff ...
    while ((bytes = reader.GetBytes(0, offset, buffer, 0, BUFFER_SIZE)) > 0)
    {
        stream.Write(buffer, 0, (int)bytes); // Timeout issues
    }
    file.SaveBinary(stream);
}

有没有其他方法可以成功完成这项任务?

** 性能原因:如果您尝试直接在 Sharepoint 上写入每个块,您会注意到随着文件增长 (>100Mb) 的性能下降。

4

3 回答 3

1

我以以下代码结束:


myFolder.Files.Add("filename", 
   new DataRecordStream(dataReader, 
      dataReader.GetOrdinal("Content"), length));

您可以在此处找到DataRecordStream 实现DbDataRecord它基本上是一个从一个通过读取数据的流.GetBytes

这种方法类似于OpenBinaryStream()/SaveBinary(stream),但它不会在您传输数据时将所有 byte[] 保存在内存中。在某些时候,DataRecordStreamMicrosoft.SharePoint.SPFile.CloneStreamToSPFileStream使用 64k 块进行访问。

谢谢大家的宝贵信息!

于 2009-09-30T13:31:46.453 回答
0

我要说的第一件事是,SharePoint真的、真的不是为此而设计的。它将所有文件存储在自己的数据库中,因此这些大文件将存储在其中。这不是一个好主意,原因有很多:可扩展性、成本、备份/恢复、性能等……所以我强烈建议改用文件共享

您可以通过更改web.config 中 httpRuntime 元素的 executionTimeout 属性来增加 Web 请求的超时时间。

除此之外,我不确定还有什么建议。我还没有听说过 SharePoint 中存储了这么大的文件。如果您绝对必须这样做,请尝试询问Server Fault

于 2009-09-29T09:19:28.700 回答
0

如前所述,在 Sharepoint 中存储大文件通常不是一个好主意。有关更多信息,请参阅本文:http: //blogs.msdn.com/joelo/archive/2007/11/08/what-not-to-store-in-sharepoint.aspx

话虽如此,可以为 BLOB 使用外部存储,这可能会或可能不会帮助您解决性能问题——微软发布了一个半完整的外部 BLOB 存储提供程序来解决问题,但不幸的是它在农场级别工作并影响所有上传。伊克。

幸运的是,由于您可以实现自己的外部 BLOB 提供程序,您可以编写一些东西来更好地处理这些特定文件。详情见这篇文章:http: //207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx

这是否值得开销取决于您遇到的问题有多大。:)

于 2009-09-29T15:29:08.997 回答