ajax上传文件以及实现上传进度条(转载)
做微信企业号的时候,在‘我的日志'功能模块里边需要添加一个上传文件的功能,并且要显示上传过程中的进度条和提交后的文件名列表,于是做了基于ajax的文件上传,UI用的是MUI框架,后台是TP框架
前端代码如下:
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script type="text/javascript" src="~/js/jquery.min.js"></script>
<script type="text/javascript" src="~/mui/dist/js/mui.min.js"></script>
</head>
<body>
<form enctype="multipart/form-data">
<div>
<div class="maven-form-file">
<button type="button" class="mui-btn mui-btn-primary mui-icon mui-icon-plus maven-btn-file">选择文件</button>
<input type="file" id="doc-form-file" multiple="multiple" />
<div id="demo" class="mui-progressbar">
<span></span>
</div>
<div id="file-list"> </div>
</div> <input type="hidden" name="token" value='' />
<input type="hidden" name="user_id" value='' />
<input type="hidden" name="wecha_id" value='' />
<div class="mui-button-row">
<button type="submit" class="mui-btn mui-btn-primary">确认</button>
<a href="javascript:history.back()" class="mui-btn mui-btn-danger">取消</a>
</div>
</div>
</form> <script type="text/javascript">
$(function () {
// mui("#demo1").progressbar({progress:20}).show(); $('#doc-form-file').on('change', function () {
var fileNames = '';
var formData = new FormData(); formData.append("myfile", this.files[0]);
if (this.files[0] == undefined) {
mui.alert('你没选文件', "提示", "确定");
return false;
} var process = 0; mui("#demo")[0].style.visibility = 'visible';
mui("#demo").progressbar({ progress: 10 }).show(); $.ajax({
url: "/UploadFile/Upload",
type: "POST",
data: formData,
contentType: false,//必须false才会自动加上正确的Content-Type
processData: false,//必须false才会避开jQuery对 formdata 的默认处理
xhr: function () { //获取ajaxSettings中的xhr对象,为它的upload属性绑定progress事件的处理函数
myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { //检查upload属性是否存在
//绑定progress事件的回调函数
myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
} return myXhr; //xhr对象返回给jQuery使用
},
success: function (data) {
mui("#demo")[0].style.visibility = 'hidden'; if (data.status == 1) {
fileNames = '<span class="mui-badge mui-badge-success">' + data.filename + '</span> <input type="hidden" name="files[]" value="' + data.id + '">';
$('#file-list').append(fileNames);
} mui.alert(data.info, "提示", "确定");
},
error: function () {
mui.alert("上传失败!", "提示", "确定");
}
});
}); function progressHandlingFunction(e) {
var curr = e.loaded;
var total = e.total;
process = curr / total * 100; mui("#demo").progressbar().setProgress(process);
}
</script>
</body>
</html>
上传的时候用到FormData对象,将文件组装成一组用 XMLHttpRequest发送请求的键/值对。然后放到ajax的data里边,但是要给ajax设置参数
- contentType: false,//必须false才会自动加上正确的Content-Type
- processData: false,//必须false才会避开jQuery对 formdata 的默认处理
进度条的实现:
在ajax的xhr的回调函数里,给他的upload属性添加onprogress事件回调,在回调函数里添加进度条的样式,回调函数的e对象里边包含loaded属性(已上传的大小),和total属性(文件的总大小),通过这个比例计算进度。
ajax上传文件以及实现上传进度条(转载)的更多相关文章
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...
- Git学习笔记——从一台电脑上传文件到Github上
目标:从一台电脑上传文件到Github上 前提: 1.这里假定已在Github上创建了仓库,建立了仓库 2.已在这台电脑上安装了Git客户端 实验环境: 1.Windows 10 64位,已安装了Gi ...
- 7.Flask-上传文件和访问上传的文件
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- Flask-上传文件和访问上传的文件
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地
使用XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地. 1.第一种方法是最常用的 :如果下载了Xshell和Xftp,Ctrl+Alt+F就可以选择文件的互传了!(虚拟机/云服务 ...
- Html+Ajax+Webservice 实现文件跨域上传
1. 界面HTML <p >上传文件: <input id="zfiles" type="file" name="file" ...
- Android上传文件至服务器(上)
每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...
- RN 上传文件到以及上传文件到七牛云(初步)
本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...
- Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)
1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...
随机推荐
- element-ui select组件中复选时以字符串形式显示
我使用的element-ui的版本是1.4.13. 如上图所示,使用el-select组件,要实现可搜索.可复选.可创建条目时,展示样式是如上图所示,输入框的高度会撑开,影响页面布局,按照产品的需求, ...
- VUE 实现复制内容到剪贴板功能
注: 依赖第三方插件 clipboard 一.安装插件 npm install vue-clipboard2 --save 二.全局注入(main.js) import VueClipboard fr ...
- sqlserver配置实践
对于一套新的sqlserver服务器,我们首先要对它做一些必要的优化配置,确保在生产上比较长的时间段内可以比较稳定的,良好的运行. 新的sqlserver服务器上安装的sqlserver版本,可以选择 ...
- python网络编程:socket、服务端、客户端
本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...
- webAPi OData的使用
一.OData介绍 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. 二.OData 在asp.net mvc中的用法 ...
- javascript获取DOM对象三种方法
1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...
- Java用户名登录学生信息管理系统并对其进行增删改查操作
package zzzzzzzz; import java.io.*;//作者:凯鲁嘎吉 - 博客园//http://www.cnblogs.com/kailugaji/ public class T ...
- swift protocol 见证容器 虚函数表 与 动态派发
一.测试代码: //protocol DiceGameDelegate: AnyObject { //} // //@objc protocol OcProtocol{ // @objc fun ...
- [NOI2005]瑰丽华尔兹
嘟嘟嘟 这题大家应该都做过,就是暴力dp+单调队列优化. dp方程其实很好想,最初是这样的:dp[t][i][j]表示时刻\(t\)后,走到\((i, j)\)格子的最远路程,于是就有: \[dp[t ...
- 转://SQL PROFILE
我们经常会碰到一些线上的SQL问题,因为执行计划不对,可能需要添加HINT才能解决.但是添加HINT就意味着需要修改应用代码.一般一个应用代码的修改.测试及发布,可能需要两三个工作日才可完成.咱们数据 ...