2

我有一个网站,它允许文件上传高达 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;

谁能指出我正确的方向?

非常感谢。

4

1 回答 1

0

由于 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,所以你可以给你的用户反馈已经上传了多少)

服务器:

  • 提供令牌,存储在字典或类似的东西中
  • 将接收到的块添加到以令牌为名称的文件中
  • 如果文件/块已正确到达,则返回

希望这会以某种方式帮助你:)。

于 2012-12-07T09:50:19.013 回答