H5原生分块上传如何异步?

by_封爱 2018-04-19 08:23:25
基本都是网上拼接出来的.





看前台

如果是同步的话 功能什么的都可以正常实现..断点续传都可以 没问题.

但是这样的话 浏览器会卡死 关闭那个代码依然在执行...而且我计算"进度"的时候 根本无法显示到UI上面.


progress = 100 * (start) / filesize;
console.log("已上传:"+progress.toFixed(2)+"%");

换成控制台 就可以..

如果换成了异步没有先后顺序后台保存也是不行的..

所以这个地方有什么办法 不让浏览器卡??
...全文
1407 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww5857693 2018-05-15
  • 打赏
  • 举报
回复
封神,我在csdn看到了tcp服务器兼容websocket的问题,我现在也遇到了这个问题,能加下qq咨询一下吗。QQ695010014
圣殿骑士18 2018-05-15
  • 打赏
  • 举报
回复
你是要做到前端异步,跟后端异步能有什么关系。前端异步都没搞定,就不要搞后端异步了,饭要一口口吃。 想不通,为什么前端异步不行?ajax本来就提供异步模式的,回调就行了。你觉得不行,是没找到办法。ajax有全局异步,仔细了解一下。
正怒月神 版主 2018-04-20
  • 打赏
  • 举报
回复
我写了一下,没什么问题,放到博客了
https://blog.csdn.net/hanjun0612/article/details/80015925
  • 打赏
  • 举报
回复
天你最后修改的这是什么啊………………你先理解一下同步和异步的意思,再想想一个文件你分块传到服务器的话服务器端接受的时候是怎么接收到的应该怎么确认是否上传完成,仔细做一下分析然后写一些文本的分析出来让大家看看你理解和分析的对不对再动手吧。
by_封爱 2018-04-20
  • 打赏
  • 举报
回复
我对异步不是很了解...现在代码让我整的都无法运行了...

首先 我这个api是UI.Page 而非webapi 也不是一般处理程序..

原来的代码是这样的.


protected void Page_Load(object sender, EventArgs e)
{
var msg = "";
if (httpType == HttpType.POST && method == "upload")
{
msg = 件上传();
}
base.WriteJson(msg, false);
}
string 文件上传()
{
if (Request.Files.Count == 0)
{
throw new MyException("文件为空");
}
if (Request.Form.AllKeys.Any(m => m == "chunk"))
{
var chunk = Convert.ToInt32(Request.Form["chunk"]);
var chunks = Convert.ToInt32(Request.Form["chunks"]);
var folder = Server.MapPath("~/upload/");
var filename = folder + Request.Form["guid"];
using (var addFile = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 1024, true))
{
using (var AddWriter = new BinaryWriter(addFile))
{
using (var stream = Request.Files[0].InputStream)
{
using (var TempReader = new BinaryReader(stream))
{
AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
TempReader.Close();
}
stream.Close();
}
AddWriter.Close();
}
addFile.Close();
}
//如果是最后一个分片,则重命名临时文件为上传的文件名
if (chunk == (chunks - 1))
{
FileInfo fileinfo = new FileInfo(filename);
var newName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid().ToString().ToUpper().Replace("-", "") + "." + Request.Files[0].FileName.Split('.').LastOrDefault();
fileinfo.MoveTo(Server.MapPath("~/upload/" + newName));
return ApiHelper.OK(new { filename = newName });
}
var obj = new { 总共 = chunks, 当前 = chunk };
throw new MyException(obj.ToJson());
}
else
{
var file = Request.Files[0];
var newName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid().ToString().ToUpper().Replace("-", "") + "." + Request.Files[0].FileName.Split('.').LastOrDefault();
file.SaveAs(Server.MapPath(@"~/upload/") + newName);
return ApiHelper.OK(new { filename = newName });
}


}



然后不是说什么异步吗...我就加了这些东西.


async Task<string> 文件上传()

msg = await 文件上传();

protected async void Page_Load(object sender, EventArgs e)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="file.aspx.cs" Inherits="api_file" Async="true" %>


结果现在网页无法运行了...





是我哪里搞错了吗...
by_封爱 2018-04-20
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
...
12345 13245之后 文件组合成之后没办法打开啊... 现在后台基本就是

onload()
{
  if xxx ==post )
  {
    resp.write(upload());
  }
}
string upload()
{
  if req.file>0 .
     saveas(...
  return new {name=....}.tojson();
}
难道 我要前台异步 后台也要异步?

onload()
{
    if xxx ==post )
  {
    resp.write(await upload());
  }
}

async  task<string> upload()
{
   //同upload
}
我对这些不太理解....是不是这个意思??@sp1234
by_封爱 2018-04-19
  • 打赏
  • 举报
回复
测试了settimeout一样不好使..在上传的时候 浏览器整体卡住..点任何地方都弹出

by_封爱 2018-04-19
  • 打赏
  • 举报
回复
或者说.. 我如何异步去执行一个"while(){同步}"的方法..
  • 打赏
  • 举报
回复
比如说你去应聘,人家过几天之后会给你打个电话通知你面试结果,这就是异步的。如果你放弃了其它家应聘,专心地堵住人家大门3天3夜硬要等待人家给你一个面试结果,这就是同步阻塞的思路。自然这样对谁都是没有效率的、浪费巨大的资源的。
sdfgrtyu 2018-04-19
  • 打赏
  • 举报
回复
打错字,,,,,,,
sdfgrtyu 2018-04-19
  • 打赏
  • 举报
回复
这个用回调,async,await不可以吗? 还有就是generator 这个我也不太懂,不过应该就是回调啊,await,async啊, 还有就是generator啊,Promise 啊 应该可以实现吧
  • 打赏
  • 举报
回复
引用 楼主 diaodiaop 的回复:
如果换成了异步没有先后顺序后台保存也是不行的..
回调自然就是“后”,这里自然就有先后顺序。异步回调就是用来保证不卡。
mirrorspace 2018-04-19
  • 打赏
  • 举报
回复
楼主搞定了吗./我也需要分小块上传较大的文件
  • 打赏
  • 举报
回复
异步、回调,这个是保证性能的基本。同步阻塞只是为了保持刚学编程时的那种不用太多动脑的习惯,必定需要更新知识。
sdfgrtyu 2018-04-19
  • 打赏
  • 举报
回复
sdfgrtyu 2018-04-19
  • 打赏
  • 举报
回复
这个问题,你可以用回调函数啊,

62,052

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧