我有一个网站,允许上传文件的最大大小为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),以便您可以向用户反馈上传了多少块


服务器:


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


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

10-05 21:00
查看更多