最原始的方式:

前端代码:

    <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. XAMPP搭建PHP

    在学习一些前后端交互时,经常会有跟PHP作为后端(服务器)的交互,不能将php文件放在本地进行请求,必须将PHP运行在Apache环境中.但是对一些新手来说,学习搭建一个Apache环境也并非易事,所 ...

  2. javaweb 关于页面获取数据

    EL(Excepress Language表达式语言) 1.....所有的EL都是以$"{"开始,以"}"结尾的.例:${sessionScope.user.s ...

  3. 一年java工作经验的面试题总结(持续更新中)

    本人是17年6月份毕业的,3月份出来实习,算起来也是工作一年了吧,金三银四,博主也考虑换一份工作,于是最近面试了几家,总结一下面试中的问题,大家一起交流学习. 第一次面试  ①说下java类的加载 ② ...

  4. 【redis源码阅读】redis对象

    结构定义 在redis中,对象的数据结构定义如下: ​typedef struct redisObject { ​unsigned type:4; ​unsgined encoding:4; ​uns ...

  5. 原生js实现简单的全屏滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. three.js 实现全景以及优化(1)

    实现一个三维全景;  然后思考优化问题; 于是我问了下webgl技术交流群朋友有啥解决方案; 对于krpano.js 的了解,只是知道百度全景用了这个技术; 最后还是选择了群友给出的three.js  ...

  7. 使用Mifare卡加密数据 笔记

    Mifare 是最常用的射频卡,具体介绍网上太多,我就不说了.,很多城市的最早的地铁公交卡都是用这种卡,后来被破解后都换成智能卡了. 但是由于技术成熟,使用方便,成本低,现在很多小区门禁卡,停车卡,食 ...

  8. 【Python】 基于秘钥的对称加密

    [Crypto] 关于用python进行信息的加密,类似的解决方案有很多比如用base64编码进行encode,再或者是hashlib来进行hash.但是还缺少一种明明场景很简单的解决方案,就是把利用 ...

  9. 【Python】 文件和操作文件方法

    文件 ■ 基本的文件用法 f = open("path","mode") mode有a,w,r,b,+等.默认为r.模式与打开文件时的动作有关系,比如用w打开的 ...

  10. STL --> map容器

    map容器 一.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 二.ma ...