最原始的方式:

前端代码:

    <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 上传文件(单个,多个,分片)的更多相关文章

  1. springmvc上传文件方法及注意事项

    本文基于注解的配置,敬请留意  基于注解整合 一.springmvc为我们提供两种上传方式配置: org.springframework.web.multipart.commons.CommonsMu ...

  2. C#实现分片上传文件

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO ...

  3. django实现分片上传文件

    目标:利用django实现上传文件功能 1,先设置路由系统 urls.py from django.conf.urls import url,include from django.contrib i ...

  4. WebUploader分片断点上传文件(二)

    写在前面: 这几天,有去研究一下WebUploader上传文件,前面的博客有记录下使用WebUploader简单上传文件的例子,今天就把分片断点上传的例子也记录下吧,在博客园中,也查看了一些资料,基本 ...

  5. 使用uploadify多文件上传,单个删除上传成功的图片

    总体思路:在用uploadify上传成功一张图片,用js生成相应的元素,放到指定的位置,并且加上删除的标志.在保存的时候,把是img的所有的值,放到对应到字段里. jsp: <tr> &l ...

  6. JQ中的FormData对象 ajax上传文件

    HTML代码: <form enctype="multipart/form-data" method="POST" name="searchfo ...

  7. node.js分片上传文件

    前端 : <html> <head> <title>分片上传文件</title> </head> <body> <div ...

  8. springboot文件上传: 单个文件上传 和 多个文件上传

    单个文件上传 //文件上传统一处理 @RequestMapping(value = "/upload",method=RequestMethod.POST) @ResponseBo ...

  9. 分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求

    获取该FileUtil工具类具体演示,公众号内回复fileutil20200501即可. package com.example.demo.util; import javax.servlet.htt ...

随机推荐

  1. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  2. BaaS 的由来(1)

    百度百科是这么定义的, BaaS(后端即服务:Backend as a Service)公司为移动应用开发者提供整合云后端的边界服务.其实不仅是移动应用,现在更多的PC应用也同样适用移动端的标准. 在 ...

  3. HTTP架构介绍(1) Web服务器和代理服务器

    HTTP应用协议本身是不能运行的,它需是需要架构在硬件和软件解决方案上,才能在万维网上提供高效的传输服务. 在这系列的文章中,我们将会了解到以下概念: Web服务器 代理服务器 缓存 网关.信道和中继 ...

  4. [解决]Linux Tomcat启动慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds

    一.背景 今天部署项目到tomcat,执行./startup.sh命令之后,访问项目迟迟加载不出来,查看日志又没报错(其实是我粗心了,当时tomcat日志还没打印完),一开始怀疑是阿里云主机出现问题, ...

  5. asp.net WebApi 使用总结

    如果想让服务端直接返回json或者xml的话,可以考虑使用webservice.wcf,或者webapi.webservice基于xml,效率较慢,wcf虽然可以返回json,但是配置繁琐.webap ...

  6. MySQL常用的查询命令

    MySQL常用的查询命令 author: headsen chen   2017-10-19  10:15:25 个人原创.转载请注明作者,出处,否则依法追究法律责任 1,查询现在的时间:mysql& ...

  7. 关于Unity的协程

    协程 认识协程 //协程不是多线程:是一段在主程序之外执行的代码 //协程不受生命周影响 //作用:能够口直代码在特定的时间执行. //1,延时操作 //2,等待某代码执行结束之后执行 /* 特点:1 ...

  8. 自定义TabBar之理解hittest

    需求的TabBar是这样的:5个 tabItem, 中间的那个 item 部分超出系统默认TabBar的上边界. 那么实现的关键点就是如何在点击它突出的部分的时候,也可以正常获得响应.我来把问题简化, ...

  9. Java面试宝典-2017

    Java面试宝典2017版 一. Java基础部分........................................................................... ...

  10. 使用枚举enum

    枚举可以把常量按照类别组织起来, 并且提供了构造方法和其他访问方法 用法: package com.nel.testPro.useage.use_enum; public enum Color imp ...