我有一个网站,允许上传文件的最大大小为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;
}
因此,为了澄清起见,我等待发布文件完全上传文件,然后再开始将其发送到数据库。
FileUpload.PostedFile.InputStream;
谁能指出我正确的方向?
非常感谢。
最佳答案
由于FileUpload控件的工作方式,我认为无法通过网络浏览器完成此操作(它可以从请求中获取文件文件,如在源代码中可以看到的)
public System.Web.HttpPostedFile PostedFile
{
get
{
if !(this.Page == null) && (this.Page.IsPostBack)
{
return this.Context.Request.Files.Item(this.UniqueID);
}
return null;
}
}
我曾经使用本地客户端通过以下步骤完成这项工作:
客户:
获取上传令牌
开始上传块(您希望的大小,尽管我建议最大文件大小为10),以便您可以向用户反馈上传了多少块
服务器:
提供令牌,存储在字典中或类似
将接收到的块添加到文件中,并将令牌作为名称
如果文件/块已正确到达,则返回
希望这会对您有所帮助:)。