2009-09-28 34 views
1

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

上传结束时出现问题;我需要通过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),您会注意到性能下降。

+0

文件的平均大小和最大大小是多少? – 2009-09-28 19:58:03

+0

大多数文件小于5MB;大文件(〜500MB)只是一个小集合 – 2009-09-28 20:54:15

回答

1

我用下面的代码结束:


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

你可以找到DataRecordStream implementation here。它基本上是一个Stream whos读取数据从DbDataRecord.GetBytes

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

谢谢大家宝贵的信息!

0

我会说的第一件事情是,真的,真的不是为此设计的。它将所有文件存储在自己的数据库中,以便这些大文件正在进行。由于许多原因,这不是一个好主意:可伸缩性,成本,备份/恢复,性能等...因此,我强烈建议使用文件共享来代替

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

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

+0

嗨亚历克斯,感谢您的意见。我意识到这个问题:我正在构建一个用于网络共享替换的wss应用程序(主要是为了限制带宽);而用户应该使用这个应用程序的小文件,大的必须考虑。 我没有问题的HttpRuntime,因为我上传文件在几个块 – 2009-09-29 20:08:53

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

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

+0

有趣的链接布雷特,我会仔细研究他们;现在我必须以这种方式完成这个应用程序; ty你的时间 – 2009-09-29 20:11:52

+0

@Brett:有一家公司开发了一个完整的SharePoint外部存储解决方案。不记得名字或者现在找到它,虽然...看起来很有趣 – 2009-09-29 20:36:11