本文乃是博主早期写的,此种思路虽然实现了,但固然不是最好的,仅做参考学习。

可以用js onprogress 、fileinput 、webuploader、jq ajaxsubmit等实现

思路:ajax异步上传文件,且开始上传文件的时候启动轮询来实时获取文件上传进度。保存进度我采用的是memcached缓存,因为项目其他地方也用了的,所以就直接用这个啦。注意:不能使用session来保存进度,因为session是线程安全的不能实时获取进度,可是试试httpcache或者memorycache,这两个我没有试过,请自行尝试。

ps:使用websocket来实现也是不错的,不过我没有试过,有心的大神可以去试试。

下面贴一张效果图:

前端ajax上传文件,我使用了两种jq插件。一种是ajaxfileupload,一种是jquery.form.js(如需下载,请百度)

下面的代码是ajaxFileUpload的:

  1. $.ajaxFileUpload
  2. (
  3. {
  4. url: '/WxManage/Media/UploadImage', //用于文件上传的服务器端请求地址
  5. secureuri: false, //是否需要安全协议,一般设置为false
  6. fileElementId: 'postFile', //文件上传域的ID
  7. type:"post",
  8. dataType: 'json', //返回值类型 一般设置为json
  9. success: function(data, status) //服务器成功响应处理函数
  10. {
  11. CloseProgressbar();//关闭进度条 设置进度条进度为100
  12. if (data.status == ) {
  13. layer.msg(data.msg, { icon: , time: },function() {
  14. parent.location.reload();
  15. });
  16. } else {
  17. $("#btnUploadFile").attr("disabled", false);
  18. layer.msg(data.msg, { icon: , time: });
  19. }
  20. },
  21. error: function(data, status, e) //服务器响应失败处理函数
  22. {
  23. $("#btnUploadFile").attr("disabled", false);
  24. CloseProgressbar();
  25. layer.closeAll("dialog");
  26. layer.msg("上传失败", { icon: , time: });
  27. }
  28. }
  29. );

后端接收文件上传请求的action:

  1. [HttpPost]
  2. public ActionResult UploadImage(HttpPostedFileBase postFile)
  3. {
  4. if (postFile == null)
  5. {
  6. return Json(BasicConfig.MessageConfig.Fail("上传文件不得为空"));
  7. }
  8.  
  9. try
  10. {
  11. string format = postFile.FileName.Split('.').Last();//后缀名
  12. SaveFile(postFile);
  13. return Json(BasicConfig.MessageConfig.Success("上传成功"));
  14. }
  15. catch (Exception ex)
  16. {
  17. return Json(BasicConfig.MessageConfig.Fail("上传失败"));
  18. }
  19. }
  1. SaveFile方法是保存文件的方法,采用的是文件流方式保存以便于计算上传进度:
    核心代码:
  1. FileStream fs = new FileStream(fileSavePath, FileMode.Create);
  2. BinaryWriter bw = new BinaryWriter(fs);
  3. BinaryReader br = new BinaryReader(postFile[i].InputStream);
  4.  
  5. int readCount = ;//单次读取的字节数
  6. while ((readCount = br.Read(bufferByte, , readBufferSize)) > )
  7. {
  8. bw.Write(bufferByte, , readCount);//写入字节到文件流
  9. bw.Flush();
  10. saveCount += readCount;//已经上传的进度
  11. mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), );//将更新到memcached缓存中
  12. Thread.Sleep();//为了看到明显的过程故意暂停
  13. }

asp.net mvc 实现上传文件带进度条的更多相关文章

  1. ASP.NET Jquery+ajax上传文件(带进度条)

    效果图 支持ie6+,chrome,ie6中文文件名会显示乱码. 上传时候会显示进度条. 需要jquery.uploadify.js插件,稍后会给出下载 前台代码 <%@ Page Langua ...

  2. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  3. FormData上传文件 带进度条

    * jQuery ajax  FormData 上传文件 template $.ajax({ url: url, type: 'POST', data: new FormData(form), dat ...

  4. java进行文件上传,带进度条

    网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...

  5. Asp.Net Mvc异步上传文件的方式

    今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...

  6. layui上传文件配合进度条

    首先看一下效果图: 修改layui的源文件upload.js 1.打开layui/modules/upload.js 2.搜索ajax 3.找到url: 4.添加以下代码: ,xhr:l.xhr(fu ...

  7. 【Web】前端文件上传,带进度条

    最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...

  8. servlet多文件上传(带进度条)

    需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus ...

  9. web文件上传,带进度条

    原生ajax上传带进度条 (百分比) <%@ page language="java" contentType="text/html; charset=UTF-8& ...

随机推荐

  1. python第四十二天 socket ---ssh

    用scoket 写一个简版的ssh 服务端: #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan import socket,os s= ...

  2. 【HANA系列】SAP HANA XS使用服务器JavaScript Libraries详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用服务器 ...

  3. BootStrap DateTimePicker的使用

    使用方法 1. 添加资源 2. 编写代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...

  4. EntityFramework Code-First 简易教程(八)-------一对一

    配置一对一(One-to-One)关系: 两个实体中,如果一个实体的一个实例与另一个实体相关,则我们就叫做一对一关系 查看如下代码: public class Student { public Stu ...

  5. SQLServer数据集合的交、并、差集运算

    SQLServer2005通过intersect,union,except和三个关键字对应交.并.差三种集合运算. 他们的对应关系可以参考下面图示 相关测试实例如下: use tempdb go if ...

  6. Jmeter压力测试简单教程(包括服务器状态监控)

    前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很 ...

  7. forever start app.js 启动node时,服务访问一次后第二次就不能访问了

    开始总是找不到原因,是因为在启动服务时,没有设置日志文件.突然想到了是不是forever安装的有问题,就重新安装forever , 这时候提示系统 no space left on device  , ...

  8. mvn 的 provided 以及 test等等 还有git团队开发技巧

    mvn 的 provided 以及 test等等 还有git团队开发技巧

  9. eclipse 右键发现没有 build-path

    1)确认下是否有.project和.classPath文件 2)点击右上角按钮先切换到java下,默认方式是javaEE 然后就能出现build path了 这是build path 子项为灰色,依然 ...

  10. Discrete Logging ZOJ - 1898 (模板题大小步算法)

    就是求Ax三B(mod C)当C为素数时 #include<cstdio> #include<cstring> #include<cmath> #include&l ...