我构建了一个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)。
答案 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
这是否值得开销取决于你有多少问题。 :)