plupload上传与springmvc整合
2017-11-26 本文已影响148人
pluto张强
plupload上传与springmvc整合看我这个就够了(并非原创只做整理,有修改)
原帖地址 http://blog.csdn.net/t894690230/article/details/37956277
plupload.html
<!-- plupload.js -->
<script type="text/javascript" src="./js/plupload.full.min.js"></script>
<!-- 国际化 -->
<script type="text/javascript" src="./js/i18n/zh_CN.js"></script>
<!-- 编码 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div id="uploadbtn">uploadbtn</div>
<script>
new plupload.Uploader({
browse_button: "uploadbtn", //DOM元素或者id
url: "/video/uploadFile.do", //服务器接收地址
filters: {
mime_types: [ //上传文件类型(数组)
{
title: "image file", //过滤器名称
extensions: "gif,jpg,png" //文件扩展名,多个时用逗号隔开
},
{
title: "zip file",
extensions: "rar,zip"
}
],
max_file_size: "500mb", //上传文件大小(可以写b,kb,gb)
prevent_duplicates: false //是否允许选取重复的文件
},
multipart: true, //是否使用multipart/form-data方式上传
multipart_params: { //附加参数
filePath: "/test"
},
max_retries: 0, //上传失败后的重试次数
chunk_size: "10mb", //分片上传切割大小
resize: {
width: 100, //压缩图片宽度
height: 100, //压缩图片高度
crop: true,
quality: 60, //压缩图片质量(默认90)
preserve_headers: false
},
drop_element: "uploadbtn", //拖拽上传区域DOM元素或者id(可以是数组)
multi_selection: false, //是否支持多文件选择
unique_names: true, //是否生成唯一name
runtimes: "html5,flash,silverlight,html4", //支持的上传方式以及优先级
file_data_name: "file", //文件域名称
flash_swf_url: "./js/Moxie.swf", //flash上传组件的url地址
silverlight_xap_url: "./js/Moxie.xap", //silverlight上传组件的url地址
init: { //监听函数
FilesAdded: function(uploader,file) { //当文件添加到上传队列后触发
uploader.start(); //开始上传
return false;
},
UploadProgress: function(uploader,file) { //会在文件上传过程中不断触发
console.info(uploader.total.percent + "%");
console.info(file.percent + "%"); //文件已上传部分所占的百分比
},
FileUploaded: function(uploader,file,responseObject) { //当队列中的某一个文件上传完成后触发
console.info(responseObject.response); //服务器返回的文本
console.info(responseObject.status); //服务器返回的http状态码,比如200
},
UploadComplete: function(uploader,file) { //当上传队列中所有文件都上传完成后触发
console.info("ok");
},
Error: function(uploader,errObject) { //当发生错误时触发
console.info(errObject.code); //错误代码
console.info(errObject.message); //错误信息
}
}
}).init(); //初始化Plupload实例
</script>
PluploadUtil.java
package com.inxedu.os.common.controller;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
/**
* Plupload是一个上传插件。
* 上传原理为单个文件依次发送至服务器.
* 上传大文件时可以将其碎片化上传。但是一般情况下,不会这样做,
* 所以这里更多的是处理普通文件的批量上传。
* 这里主要处理文件上传
*/
public class PluploadUtil {
private static final int BUF_SIZE = 2 * 1024;
/**
* 用于Plupload插件的文件上传
* @param plupload - 存放上传所需参数的bean
* @param dir - 保存目标文件目录
* @throws IllegalStateException
* @throws IOException
*/
public static void upload(Plupload plupload, File dir) throws IllegalStateException, IOException {
//生成唯一的文件名
plupload.setFileName(System.currentTimeMillis() + plupload.getName());
int chunks = plupload.getChunks(); //获取总的碎片数
int chunk = plupload.getChunk(); //获取当前碎片(从0开始计数)
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) plupload.getRequest();
MultiValueMap<String, MultipartFile> map = multipartRequest.getMultiFileMap();
if(map != null) {
if (!dir.exists()) dir.mkdirs(); //如果目标文件夹不存在则创建新的文件夹
//事实上迭代器中只存在一个值,所以只需要返回一个值即可
Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()) {
String str = (String) iter.next();
List<MultipartFile> fileList = map.get(str);
for(MultipartFile multipartFile : fileList) {
//因为只存在一个值,所以最后返回的既是第一个也是最后一个值
plupload.setMultipartFile(multipartFile);
//创建新目标文件
File targetFile = new File(dir.getPath()+ "/" + plupload.getFileName());
//当chunks>1则说明当前传的文件为一块碎片,需要合并
if (chunks > 1) {
//需要创建临时文件名,最后再更改名称
File tempFile = new File(dir.getPath()+ "/" + multipartFile.getName());
//如果chunk==0,则代表第一块碎片,不需要合并
saveUploadFile(multipartFile.getInputStream(), tempFile, chunk == 0 ? false : true);
//上传并合并完成,则将临时名称更改为指定名称
if (chunks - chunk == 1) {
tempFile.renameTo(targetFile);
}
} else {
//否则直接将文件内容拷贝至新文件
multipartFile.transferTo(targetFile);
}
}
}
}
}
/**
* 保存上传文件,兼合并功能
*/
private static void saveUploadFile(InputStream input, File targetFile, boolean append) throws IOException {
OutputStream out = null;
try {
if (targetFile.exists() && append) {
out = new BufferedOutputStream(new FileOutputStream(targetFile, true), BUF_SIZE);
} else {
out = new BufferedOutputStream(new FileOutputStream(targetFile), BUF_SIZE);
}
byte[] buffer = new byte[BUF_SIZE];
int len = 0;
//写入文件
while ((len = input.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
throw e;
} finally {
//关闭输入输出流
if (null != input) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 判断是否全部上传完成
* 碎片需合并后才返回真
*/
public static boolean isUploadFinish(Plupload plupload) {
return (plupload.getChunks() - plupload.getChunk() == 1);
}
}
Plupload.java
package com.inxedu.os.common.controller;
import javax.servlet.http.HttpServletRequest;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
/**
* Plupload是一个上传插件。
* 这是一个bean类,主要存储Plupload插件上传时需要的参数。
* 属性名不可随意改动.
* 这里主要使用MultipartFile文件上传方法
*/
@Data
public class Plupload {
/**文件临时名(大文件被分解时)*/
private String name;
/**保存的文件名*/
private String fileName;
/**总的块数*/
private int chunks = -1;
/**当前块数(从0开始计数)*/
private int chunk = -1;
/**HttpServletRequest对象,不能直接传入进来,需要手动传入*/
private HttpServletRequest request;
/**保存文件上传信息,不能直接传入进来,需要手动传入*/
private MultipartFile multipartFile;
}
VideoUploadController.java
/**上传处理方法*/
@RequestMapping(value="/uploadFile.do", method = RequestMethod.POST)
public void upload(Plupload plupload,HttpServletRequest request, HttpServletResponse response, @RequestParam("filePath") String filePath) throws IOException {
System.out.println(plupload.getChunk() + "===" + plupload.getName() + "---" + plupload.getChunks());
plupload.setRequest(request);
//文件存储路径
File dir = new File(getProjectRootDirPath(request) + filePath);
System.out.println(dir.getPath());
try {
//上传文件
PluploadUtil.upload(plupload, dir);
//判断文件是否上传成功(被分成块的文件是否全部上传完成)
if (PluploadUtil.isUploadFinish(plupload)) {
Map<String, Object> m = new HashMap<String, Object>();
m.put( "status", true);
m.put( "fileUrl", filePath + "/" + plupload.getFileName());
response.getWriter().write(JSONUtils.toJSONString(m));
System.out.println("---" + filePath + "/" + plupload.getFileName());
}
} catch (Exception e) {
Map<String, Object> m = new HashMap<String, Object>();
m.put( "status", false);
response.getWriter().write(JSONUtils.toJSONString(m));
}
}