我构建了一个WSSv3应用程序,它以小块的形式上传文件;当每个数据块到达时,出于性能原因**,我暂时将其保留在SQL2005图像数据类型字段中。
上传结束时会出现问题;我需要通过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),性能会下降。
发布于 2009-09-30 13:31:46
我以以下代码结束:
myFolder.Files.Add("filename",
new DataRecordStream(dataReader,
dataReader.GetOrdinal("Content"), length));你可以找到DataRecordStream implementation here。它基本上是一个通过.GetBytes从DbDataRecord读取数据流
这种方法类似于OpenBinaryStream()/SaveBinary(stream),但它不会在传输数据时将所有byte[]保留在内存中。在某些情况下,将使用64k块从Microsoft.SharePoint.SPFile.CloneStreamToSPFileStream访问DataRecordStream。
感谢你们提供的宝贵信息!
发布于 2009-09-29 09:19:29
我要说的第一件事是,SharePoint真的、真的不是为此而设计的。它将所有文件存储在自己的数据库中,所以这些大文件就是要去的地方。这不是一个好主意,原因有很多:可伸缩性、成本、备份/恢复、性能等。所以我强烈推荐使用文件共享。
您可以通过更改httpRuntime element in web.config的executionTimeout属性来增加web请求的超时。
除此之外,我不确定还能有什么建议。我还没有听说过在SharePoint中存储这么大的文件。如果你一定要这样做,也可以尝试在Server Fault上提问。
发布于 2009-09-29 15:29:09
如前所述,在Sharepoint中存储大文件通常不是一个好主意。有关更多信息,请参阅本文:http://blogs.msdn.com/joelo/archive/2007/11/08/what-not-to-store-in-sharepoint.aspx
也就是说,可以为BLOB使用外部存储,这可能会也可能不会帮助您的性能问题- Microsoft发布了一个半完整的外部BLOB存储提供程序,它可以做到这一点,但不幸的是,它在服务器场级别工作,并影响所有上传。尼克。
幸运的是,由于您可以实现自己的外部BLOB提供程序,因此可以编写一些内容来更好地处理这些特定文件。有关详细信息,请参阅本文:http://207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx
这是否值得开销取决于您遇到了多大的问题。:)
https://stackoverflow.com/questions/1488653
复制相似问题