gpt4 book ai didi

c# - 在 asp.net 中分块 FileUpload

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:23 25 4
gpt4 key购买 nike

我有一个网站,该网站允许最大 1gb 的文件上传,此时它将文件读入文件流,然后将其作为二进制内容写入 MSSQL 数据库。

我发现这越来越多地占用大量资源,因此我研究了“分块”文件,以便它以 4mb block 的形式出现。

我知道了,所以 block 会进入数据库,但现在上传的时间是从 FileUpload 控件到 FileStream 的两倍,一旦它存在,然后开始将其以 block 的形式写入数据库。

理想情况下,我希望它直接从 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;

谁能指出我正确的方向?

非常感谢。

最佳答案

由于 FileUpload 控件的工作方式,我认为这不能通过网络浏览器完成(它从请求中获取文件文件,如源代码所示)

public System.Web.HttpPostedFile PostedFile
{
get
{
if !(this.Page == null) && (this.Page.IsPostBack)
{
return this.Context.Request.Files.Item(this.UniqueID);
}
return null;
}
}

我曾经通过以下步骤使用 native 客户端完成这项工作:

客户:

  • 获取上传 token
  • 开始上传 block (您喜欢的大小,但我建议最大文件大小/10,这样您就可以向用户反馈已上传了多少)

服务器:

  • 提供token,存入字典或类似排序
  • 将接收到的 block 添加到以 token 为名称的文件中
  • 如果文件/ block 正确到达则返回

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

关于c# - 在 asp.net 中分块 FileUpload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com