我有一个允许文件上传量高达1GB的网站,目前它将文件读入文件流,然后将其作为二进制内容写入MSSQL数据库。
我发现这越来越多地占用了大量的资源,因此我调查了“分块”文件,以便它以4mb块的形式存在。
我已经得到了它,所以块进入数据库,但它现在需要两倍的上传时间,因为它从FileUpload控件到FileStream,一旦它有,然后开始以块的形式写入数据库。
理想情况下,我希望它直接来自FileUpload,因此当4mb在InputStream中时,它开始写入数据库。这是我到目前为止测试的内容:
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;
有人能指出我正确的方向吗?
非常感谢。
答案 0 :(得分:0)
由于FileUpload控件的工作方式,我不认为这可以通过webbrowser完成(它从请求中获取文件文件,如源代码所示)
public System.Web.HttpPostedFile PostedFile
{
get
{
if !(this.Page == null) && (this.Page.IsPostBack)
{
return this.Context.Request.Files.Item(this.UniqueID);
}
return null;
}
}
我曾使用以下步骤使用本机客户端完成此工作:
客户端:
服务器:
希望这会以某种方式帮助你:)。