JQ 上传文件(单个,多个,分片)
最原始的方式:
前端代码:
<div>
<span>最原始的方式</span><br />
<span>条件1:必须是 post 方式</span><br />
<span>条件2:必须注明是传输文件 enctype="multipart/form-data"</span><br />
<span>条件3:必须设置name属性,name="myFile"</span><br />
<form id="myForm1" method="post" enctype="multipart/form-data" action="http://localhost:42561/api/upload/upload">
<input type="file" name="myFile" />
<input type="submit" value="原始form表单上传文件" />
</form>
</div>
后台代码:
public async Task<HttpResponseMessage> Upload()
{
var files = HttpContext.Current.Request.Files;
var path = HttpContext.Current.Server.MapPath("/img/");
if (files.Count > )
{
foreach (string file in files)
{
//这里的 file ,就是 input[type="file"] 标签的name属性的值,
//这也是为什么上传文件,input[type="file"] 标签必须设置name属性的值的原因之一.
var img = files[file];
if (img?.ContentLength > )
{
var fileName = img.FileName;
await Task.Run(() => img.SaveAs(path + fileName));
}
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "没有文件");
}
利用FormData上传单个文件
前端代码:
<div>
<span>利用FormData上传单个文件</span><br />
<form id="myForm2">
<input type="file" name="myFile" />
<input type="button" value="利用FormData上传单个文件" onclick="uploadOne()" />
</form>
</div>
function uploadOne() {
var url = "http://localhost:42561/api/upload/upload";
//这里之所以会写成[0],是因为$(...)是JQ对象,是个数组,而这里需要传入的是JS对象.
var data = new FormData($("#myForm2")[0]);
$.ajax({
url: url,
data: data,
type: "post",
processData: false,//表示提交的时候不会序列化 data,而是直接使用 data,默认为 true
contentType: false,//表示不要去设置Content-Type请求头
cache: false,//设置为 false 将不会从浏览器缓存中加载请求信息。
success: function () { }
});
}
利用FormData上传多个文件
前端代码:
<div>
<span>利用FormData上传多个文件</span><br />
<form id="myForm3">
<input type="file" id="myFile" multiple />
<input type="button" value="利用FormData上传多个文件" onclick="uploadSome()" />
</form>
</div>
function uploadSome() {
var url = "http://localhost:42561/api/upload/upload";
var data = new FormData();
var files = $("#myFile")[0].files;
for (var i = 0; i < files.length; i++) {
//这里的 myFile0,myFile1,myFile2就是input type="file" 标签的name属性,所以标签里面可以不用写name属性了
data.append("myFile" + i, $("#myFile")[0].files[i]);
}
$.ajax({
url: url,
data: data,
type: "post",
processData: false,
contentType: false,
cache: false,
success: function () { }
});
}
分片上传
前端代码:
<div>
<span>分片上传单个文件</span><br />
<form id="myForm4">
<input type="file" id="myFileStep" />
<input type="button" value="分片上传单个文件" onclick="uploadStep()"/>
</form>
<br />
<span class="result"></span>
</div>
function uploadStep() {
var upload = function (file, skip) {
var data = new FormData();
var blockSize = 1000;
var nextSize = Math.min((skip + 1) * blockSize, file.size);
var fileData = file.slice(skip * blockSize, nextSize);
data.append("myFile", fileData);
//由于传输的是二进制数据(fileData),后台(MVC或者Api无法通过files[0].FileName获取文件名
//所以只能通过构造form表单数据传递(键值对形式,fileName=xxx.jpg&aaa=yyy),后台再通过request.Form[fileName]获取
data.append("fileName", file.name);
var url = "http://localhost:42561/api/upload/uploadStep";
$.ajax({
url: url,
type: "POST",
data: data,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: function () {
$(".result").html("已经上传了" + (skip + 1) + "块文件");
if (file.size <= nextSize) { //如果上传完成,则跳出继续上传
alert("上传完成");
return;
}
upload(file, ++skip); //递归调用
}
});
};
var file = $("#myFileStep")[0].files[0];
upload(file, 0);
}
后台代码:
public HttpResponseMessage UploadStep()
{
var path = HttpContext.Current.Server.MapPath("/img/");
var name = HttpContext.Current.Request.Form["fileName"];
var filePath = path + name;
//创建一个追加(FileMode.Append)方式的文件流
using (FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write))
{
var file = HttpContext.Current.Request.Files[];
//方法一
using (BinaryWriter bw = new BinaryWriter(fs))
{
//读取文件流
BinaryReader br = new BinaryReader(file.InputStream);
//将文件流转成字节数组
byte[] bytes = br.ReadBytes((int)file.InputStream.Length);
//将字节数组追加到文件
bw.Write(bytes);
br.Dispose();
}
//方法二
//Stream sm = file.InputStream;
//byte[] bytes = new byte[sm.Length];
//sm.Read(bytes, 0, bytes.Length);
//fs.Write(bytes, 0, bytes.Length);
//sm.Dispose();
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
JQ 上传文件(单个,多个,分片)的更多相关文章
- springmvc上传文件方法及注意事项
本文基于注解的配置,敬请留意 基于注解整合 一.springmvc为我们提供两种上传方式配置: org.springframework.web.multipart.commons.CommonsMu ...
- C#实现分片上传文件
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO ...
- django实现分片上传文件
目标:利用django实现上传文件功能 1,先设置路由系统 urls.py from django.conf.urls import url,include from django.contrib i ...
- WebUploader分片断点上传文件(二)
写在前面: 这几天,有去研究一下WebUploader上传文件,前面的博客有记录下使用WebUploader简单上传文件的例子,今天就把分片断点上传的例子也记录下吧,在博客园中,也查看了一些资料,基本 ...
- 使用uploadify多文件上传,单个删除上传成功的图片
总体思路:在用uploadify上传成功一张图片,用js生成相应的元素,放到指定的位置,并且加上删除的标志.在保存的时候,把是img的所有的值,放到对应到字段里. jsp: <tr> &l ...
- JQ中的FormData对象 ajax上传文件
HTML代码: <form enctype="multipart/form-data" method="POST" name="searchfo ...
- node.js分片上传文件
前端 : <html> <head> <title>分片上传文件</title> </head> <body> <div ...
- springboot文件上传: 单个文件上传 和 多个文件上传
单个文件上传 //文件上传统一处理 @RequestMapping(value = "/upload",method=RequestMethod.POST) @ResponseBo ...
- 分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求
获取该FileUtil工具类具体演示,公众号内回复fileutil20200501即可. package com.example.demo.util; import javax.servlet.htt ...
随机推荐
- github远程仓库初始化配置
github远程仓库的提交一般是通过shell进行,windows下有Git Bash工具(https://git-for-windows.github.io/) 由于本地Git仓库和GitHub仓库 ...
- RocketMQ与kafka对比(官方)
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...
- Java NIO FileVisitor 高效删除文件
在公司项目中,由于做个二维码扫码平台项目,预计每天产生的二维码图片达到十几G,所以要做个定时清理任务来定时清理图片,根据不同场景保留图片,规则是:1.二维码统一登录图片几个小时有效 2.电子名片二 ...
- WordPress文章首行缩进
WordPress后台编辑文章的时候会自动删除多余的空格,也就是说,你在后台编辑文章的时候添加的一些空格和换行在前台都是看不见的,都是被WordPress忽略了的,今天就讲讲怎么给所有文章添加首行缩进 ...
- 温故而知新-set
set:同map一样,关联式容器.在插入时就会进行排序,主要特点如下: 1.记录元素即是key值又是value值 2.插入的时候严格排序,底层是红黑树 3.删除元素时只要操作指针节点,无需进行内存的拷 ...
- freemarker的classic_compatible设置,解决报空错误
前段时间接触freemaker时,本来后端写各接口运行正常,但加入了模板后,频繁报空指针问题,整了许久,最后还是请教了别人解决了这个问题,现在记录下来,方便以后碰到了可以查阅. 错误样例如下: ERR ...
- firemonkey ListView DynamicAppearance
Go Up to FireMonkey Application Design Contents [hide] 1 Customizing the List View Appearance Prope ...
- kubernetes关键概念总结
service 每个service对应一个cluster IP,cluster IP对应的服务网段最初是在配置kube-apiserver.kube-controller-manager和kube-p ...
- vue的图片上传
转载 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- C语言第三次博客作业---单层循环结构
一.PTA实验作业 题目1 1.实验代码 int N,i; //N为用户数,i记录循环变量 double height; //height放身高 char sex; //sex放性别F为女,M为男 s ...