【发布时间】:2012-12-07 09:13:20
【问题描述】:
我有一个网站,它允许文件上传高达 1gb,目前它将文件读入 Filestream,然后将其作为二进制内容写入 MSSQL 数据库。
我发现这越来越多地占用大量资源,因此我研究了“分块”文件,以便它进入 4mb 块。
我已经得到它,所以块进入数据库,但现在上传时间是从 FileUpload 控件到 FileStream 的两倍,一旦它开始将它以块的形式写入数据库。
理想情况下,我希望它直接从 FileUpload 分块,这样当 InputStream 中有 4mb 时,它就开始写入数据库。以下是我迄今为止测试过的内容:
Stream fs = FileUpload.PostedFile.InputStream;
int BUFFER_SIZE = 4000;
byte[] chunk = new byte[BUFFER_SIZE];
SqlConnection connection = new SqlConnection(ConfigurationSettings.AppSettings["SQLConnection"]);
connection.Open();
SqlCommand cmd = new SqlCommand("UPDATE TABLENAME SET Content.WRITE(@data, NULL, 0) WHERE ID ='" + DocID + "'", connection);
SqlParameter dataParam = cmd.Parameters.Add("@data", SqlDbType.VarBinary); // remaining as Update.WRITE
SqlParameter lengthParam = cmd.Parameters.Add("@length", SqlDbType.Int);
int cIndex = 0;
int readBytes = 0;
int fileSize = System.Convert.ToInt32(fs.Length);
while (cIndex < fileSize)
{
if (cIndex + BUFFER_SIZE > fileSize)
readBytes = fileSize - cIndex;
else
readBytes = BUFFER_SIZE;
fs.Read(chunk, 0, readBytes);
dataParam.Value = chunk;
dataParam.Size = readBytes;
lengthParam.Value = readBytes;
cmd.ExecuteNonQuery();
cIndex += BUFFER_SIZE;
}
澄清一下,我正在等待 PostedFile 完全上传文件,然后才能开始将其发送到数据库。
FileUpload.PostedFile.InputStream;
谁能指出我正确的方向?
非常感谢。
【问题讨论】:
标签: c# asp.net sql-server