百度webUploader分片断点上传java后台代码

javaweb 同时被 2 个专栏收录
3 篇文章 0 订阅
3 篇文章 0 订阅

以下代码有部分类未粘贴出来。分别是服务器Session,用户类和返回值HashMap的封装类,这些类根据项目的

不同封装的也不同,请酌情使用.

package com.css.commcon.bean;

import org.springframework.web.multipart.MultipartFile;

public class Webuploader {
//uploader自带参数
private MultipartFile file;
private String chunks;//总分片量
private String chunk;//当前分片
private String name;//文件名称
private String size;//文件大小
private String lastModifiedDate;//最后修改时间
private String type;//文件类型
private String id;//文件id
//自定义参数
String fileMd5;
String rate;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
public String getChunks() {
return chunks;
}
public void setChunks(String chunks) {
this.chunks = chunks;
}
public String getChunk() {
return chunk;
}
public void setChunk(String chunk) {
this.chunk = chunk;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(String lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFileMd5() {
return fileMd5;
}
public void setFileMd5(String fileMd5) {
this.fileMd5 = fileMd5;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
@Override
public String toString() {
return "Uploader [file=" + file + ", chunks=" + chunks + ", chunk=" + chunk + ", name=" + name + ", size="
+ size + ", lastModifiedDate=" + lastModifiedDate + ", type=" + type + ", id=" + id + ", fileMd5="
+ fileMd5 + ", rate=" + rate + "]";
}


}

/**   

* @Title: WebuploadAction.java 
* @Package com.css.commcon.controller 
* @author jialiang  
* @date 2017年12月13日 上午10:53:52 
*/
package com.css.commcon.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;


import javax.servlet.http.HttpServletRequest;


import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;


import com.css.commcon.bean.Webuploader;
import com.css.commcon.controller.support.JsonWrapper;
import com.css.commcon.util.SessionUtils;
import com.css.sysManage.bean.SysUser;


/**
 * @ClassName: WebuploadAction
 * @Description: TODO( webupload上传插件所需方法 )
 * @date 2017年12月13日 上午10:53:52
 */
@Controller
@RequestMapping("/webuploadAction")
public class WebuploadAction {


public final transient Logger log = LoggerFactory.getLogger(WebuploadAction.class);

/**
* 为每个用户单独创建了一个自己的上传文件的文件夹

* @Title: uploader
* @Description: TODO( 百度上传插件webuploader服务端接受 )
* @param request
* @param uploader
* @return
* @date 2017年12月15日 下午3:05:01
*/
@RequestMapping("/uploader")
@ResponseBody
public HashMap<String, Object> uploader(HttpServletRequest request, Webuploader uploader) {
MultipartFile file = uploader.getFile();
String chunk = uploader.getChunk();
String realname = uploader.getName();
SysUser user = SessionUtils.getUser(request);
String username = user.getAccount();
Date now = new Date();
SimpleDateFormat formater = new SimpleDateFormat("yyyy"+File.separator+"MM"+File.separator+"dd");
String path = "D:\\data\\";
path += formater.format(now) + File.separator + username + File.separator;
String newName = now.getTime() + realname;
try {
if (file != null) {
// 判断上传的文件是否被分片
if (null == uploader.getChunks() && null == chunk) {
File destTempFile = new File(path, newName);
if (!destTempFile.exists()) {
destTempFile.mkdirs();
}
file.transferTo(destTempFile);
destTempFile.createNewFile();
path += File.separator + newName;
// log.info("上传成功:"+realname+" 服务务器存放位路径:"+path);
return JsonWrapper.successWrapper(path, "上传成功");
}
path = path + File.separator + "part" + File.separator;
File parentFileDir = new File(path);
if (!parentFileDir.exists()) {
parentFileDir.mkdirs();
}
File f = new File(path + File.separator + realname + "_" + chunk + ".part");
if (!f.exists()) {
file.transferTo(f);
f.createNewFile();
}
path="D:\\data\\"+formater.format(now)+File.separator+username+File.separator+realname;
return JsonWrapper.successWrapper(path, "上传成功");
}
return JsonWrapper.failureWrapper("文件不存在");
} catch (Exception e) {
return JsonWrapper.failureWrapper("上传失败");
}
}


/**

* @Title: checkChunks
* @Description: TODO(验证切片是否已经上传或者是否完整)
* @param request
* @param uploader
* @return HashMap<String,Object> 返回类型
* @date 2017年12月11日 下午4:49:04
*/
@RequestMapping("/checkChunks")
@ResponseBody
public HashMap<String, Object> checkChunks(HttpServletRequest request, Webuploader uploader) {
// 获取当前用户
try {
SysUser user = SessionUtils.getUser(request);
Date now = new Date();
SimpleDateFormat formater = new SimpleDateFormat("yyyy"+File.separator+"MM"+File.separator+"dd");
String path = "D:\\data\\";
path += formater.format(now) + File.separator + user.getAccount().trim() + File.separator;
String newFile = user.getId() + uploader.getName();
String jindu = uploader.getRate();
if ("".equals(jindu)) {
jindu = "0";
}
SessionUtils.setAttr(request, "jindu_" + newFile, jindu);
String fileDir = path + File.separator + "part" + File.separator;


File f = new File(fileDir + File.separator + uploader.getName() + "_" + uploader.getChunk() + ".part");
if (f.exists() && f.length() == new Integer(uploader.getSize())) {
return JsonWrapper.successWrapper("1", "检查方法无误");
}
return JsonWrapper.successWrapper("-1", "检查方法无误");
} catch (Exception e) {
return JsonWrapper.failureWrapper("检查失败");
}


}


/**

* @Title: mixChunks
* @Description: TODO(将所有的切片合成)
* @param request
* @param uploader
* @return HashMap<String,Object> 返回类型
* @date 2017年12月11日 下午4:48:52
*/
@RequestMapping("/mixChunks")
@ResponseBody
public HashMap<String, Object> mixChunks(HttpServletRequest request, Webuploader uploader) {
/*if(uploader.getChunk()==null&&uploader.getChunks()==null){
return JsonWrapper.successWrapper(uploader, "不需要合成!");
}*/
Date now = new Date();
SimpleDateFormat formater = new SimpleDateFormat("yyyy"+File.separator+"MM"+File.separator+"dd");
String path = "D:\\data\\";
path += formater.format(now);
SysUser user = SessionUtils.getUser(request);
String name = uploader.getName();
String fileDir = path + File.separator + user.getAccount().trim() + File.separator + "part" + File.separator;
String filePath = path + File.separator + user.getAccount().trim() + File.separator;
File parentFileDir = new File(fileDir);
FileOutputStream destTempfos = null;
try {
synchronized (this) {
File destTempFile = new File(filePath, name);// ??now.getTime()+name大文件是否需要重新命名
File[] files = parentFileDir.listFiles();
for (int i = 0; i < files.length; i++) {
File partFile = new File(fileDir, name + "_" + i + ".part");
destTempfos = new FileOutputStream(destTempFile, true);
FileUtils.copyFile(partFile, destTempfos);
}
FileUtils.deleteDirectory(parentFileDir);
destTempfos.close();
}
if(destTempfos!=null){
destTempfos.close();
}
String newFaile = user.getId() + name;
SessionUtils.setAttr(request, "jindu_" + newFaile, uploader.getRate());
return JsonWrapper.successWrapper(filePath+File.separator+name, "合成完毕");
} catch (Exception e) {
return JsonWrapper.failureWrapper("合成失败");
}
}


/**
* @Title: getProgress
* @Description: TODO(获取当前文件是否上传,上传进度是多少)
* @param request
* @param fileName
* @return HashMap<String,Object> 返回类型
* @date 2017年12月11日 下午5:03:21
*/
@RequestMapping("/getProgress")
@ResponseBody
public HashMap<String, Object> getProgress(HttpServletRequest request, Webuploader uploader) {
SysUser user = SessionUtils.getUser(request);
String newFaile = user.getId() + uploader.getName();
String rate = "0";
Date now = new Date();
SimpleDateFormat formater = new SimpleDateFormat("yyyy"+File.separator+"MM"+File.separator+"dd");
String path = "D:\\data\\";
path += formater.format(now);
String filePath = path + File.separator + user.getAccount().trim() + File.separator;
if (null != uploader.getName() && !"".equals(uploader.getName())) {
try {
// 获取session里面的值
rate = SessionUtils.getAttr(request, "jindu_" + newFaile).toString();
// 获取文件
File file = new File(filePath, uploader.getName());// ???暂时没有用时间的毫秒数改了名字
// 查看文件是否存在或者是否完整
if (!file.exists()) {
rate = "0";
}
} catch (Exception e) {
rate = "0";
}
}
return JsonWrapper.successWrapper(rate, filePath + File.separator + uploader.getName());
}


/**
* @Title: upload2
* @Description: TODO( webuploader上传方法,不支持断点,若断点,相当于重新上传 )
* @param request
* @param uploader
* @return
* @date 2017年12月15日 下午2:42:36
*/
@RequestMapping("/upload2")
@ResponseBody
public HashMap<String, Object> upload2(HttpServletRequest request, Webuploader uploader) {
MultipartFile file = uploader.getFile();
String chunks = uploader.getChunks();
String chunk = uploader.getChunk();
String name = uploader.getName();
try {
if (file != null) {
// 判断上传的文件是否被分片
if (null == chunks && null == chunk) {
File destTempFile = new File("D:\\data\\part\\", name);
if (!destTempFile.exists()) {
destTempFile.mkdirs();
}
file.transferTo(destTempFile);
destTempFile.createNewFile();
return JsonWrapper.successWrapper("上传完毕");
}
String tempFileDir = "D:\\data\\part\\" + File.separator + name;
File parentFileDir = new File(tempFileDir);
if (!parentFileDir.exists()) {
parentFileDir.mkdirs();
}
File f = new File(tempFileDir + File.separator + name + "_" + chunk + ".part");
if (!f.exists()) {
file.transferTo(f);
f.createNewFile();
}
// 是否全部上传完成
// 所有分片都存在才说明整个文件上传完成
boolean uploadDone = true;
for (int i = 0; i < Integer.parseInt(chunks); i++) {
File partFile = new File(tempFileDir, name + "_" + i + ".part");
if (!partFile.exists()) {
uploadDone = false;
return JsonWrapper.successWrapper("上传完毕");
}
}
// 所有分片文件都上传完成
// 将所有分片文件合并到一个文件中
if (uploadDone) {
synchronized (this) {
File destTempFile = new File("D:\\data\\", name);
for (int i = 0; i < Integer.parseInt(chunks); i++) {
File partFile = new File(tempFileDir, name + "_" + i + ".part");
FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);
FileUtils.copyFile(partFile, destTempfos);
destTempfos.close();
}
FileUtils.deleteDirectory(parentFileDir);
}
}
return JsonWrapper.successWrapper("上传完毕");
}
return JsonWrapper.failureWrapper("文件不存在");
} catch (Exception e) {
this.log.error("上传失败", e);
return JsonWrapper.failureWrapper("上传失败");
}
}

}



以上代码有借鉴网上大神处,若侵权请联系作者!

  • 1
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

宗云

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值