在asp.net中添加一个FileUpload

时间:2012-12-07 09:13:20

标签: c# asp.net sql-server

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

有人能指出我正确的方向吗?

非常感谢。

1 个答案:

答案 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;
    }
}

我曾使用以下步骤使用本机客户端完成此工作:

客户端:

  • 获取上传令牌
  • 开始上传大块(您喜欢的大小,但我建议使用max filesize / 10,这样您就可以向用户反馈已上传的内容)

服务器:

  • 提供令牌,存储在字典或sortalike中
  • 将收到的块添加到文件中,使用令牌作为名称
  • 如果文件/块正确到达则返回

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