大文件上传到WSS v3

时间:2009-09-28 18:39:24

标签: sharepoint upload wss-3.0 large-files

我构建了一个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)。

3 个答案:

答案 0 :(得分:1)

我结束了以下代码:


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

您可以找到DataRecordStream implementation here。它基本上是一个Stream,用于从DbDataRecord.GetBytes

读取数据

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

感谢所有宝贵的信息!

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

幸运的是,由于您可以实现自己的外部BLOB提供程序,因此您可以编写一些内容来更好地处理这些特定文件。有关详细信息,请参阅此文章:http://207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx

这是否值得开销取决于你有多少问题。 :)