【发布时间】:2017-02-10 16:38:59
【问题描述】:
我正在 ASP.Net Core 中编写文件上传,并尝试更新进度条,但是当从 javascript 调用 Progress 操作时,会话值未正确更新。
进度保存在用户会话中使用:
public static void StoreInt(ISession session, string key, int value)
{
session.SetInt32(key, value);
}
上传:
$.ajax(
{
url: "/Upload",
data: formData,
processData: false,
contentType: false,
type: "POST",
success: function (data) {
clearInterval(intervalId);
$("#progress").hide();
$("#upload-status").show();
}
}
);
获取进度值:
intervalId = setInterval(
function () {
$.post(
"/Upload/Progress",
function (progress) {
$(".progress-bar").css("width", progress + "%").attr("aria-valuenow", progress);
$(".progress-bar").html(progress + "%");
}
);
},
1000
);
上传动作:
[HttpPost]
public async Task<IActionResult> Index(IList<IFormFile> files)
{
SetProgress(HttpContext.Session, 0);
[...]
foreach (IFormFile file in files)
{
[...]
int progress = (int)((float)totalReadBytes / (float)totalBytes * 100.0);
SetProgress(HttpContext.Session, progress);
// GetProgress(HttpContext.Session) returns the correct value
}
return Content("success");
}
进展行动:
[HttpPost]
public ActionResult Progress()
{
int progress = GetProgress(HttpContext.Session);
// GetProgress doesn't return the correct value: 0 when uploading the first file, a random value (0-100) when uploading any other file
return Content(progress.ToString());
}
【问题讨论】:
-
你在本地测试这个,你上传的文件长度是多少?
-
我在本地和远程服务器上都试过了,都失败了。我还尝试了单个/多个小/大文件。在这里,我创建了一个解决方案来重现该问题:github.com/Fxbouffant/FileUploadCore 在文件仍在上传时,进度操作始终返回 0。然后上传文件时返回100,中间没有值。
-
检查进度的间隔为1秒。是不是在检查进程之前下载就结束了?
-
这不是上传进度的好方法。而且不会一帆风顺。我通过
xmlHttpRequest创建实时连接,但它是 asp.net 而不是 mvc。你想要吗? -
谢谢,太完美了。我使用 xhr 事件来更新进度。
标签: c# jquery asp.net-core