【问题标题】:Chunking a FileUpload in asp.net在 asp.net 中分块文件上传
【发布时间】: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


    【解决方案1】:

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

    服务器:

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

    希望这对您有所帮助:)。

    【讨论】:

    • 非常感谢,这无疑为我指明了正确的方向。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2014-08-19
    • 2016-03-19
    • 2018-09-30
    • 2017-01-08
    • 2022-11-24
    • 2011-02-25
    • 2011-03-30
    相关资源
    最近更新 更多