提交 e29aa13e authored 作者: zhangshuang's avatar zhangshuang

swagger和批量上传

上级 43c378c0
package com.zjty.efs.ftp.base.response; package com.zjty.efs.ftp.base.response;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import static com.zjty.efs.ftp.base.response.ResponseCode.*; import static com.zjty.efs.ftp.base.response.ResponseCode.*;
...@@ -14,23 +17,28 @@ import static com.zjty.efs.ftp.base.response.ResponseCode.*; ...@@ -14,23 +17,28 @@ import static com.zjty.efs.ftp.base.response.ResponseCode.*;
*/ */
@SuppressWarnings({"WeakerAccess", "unused"}) @SuppressWarnings({"WeakerAccess", "unused"})
@Getter @Getter
@AutoDocument
@ApiModel(value = "响应体", description = "封装好的响应体")
public class ServerResponse<T> { public class ServerResponse<T> {
/** /**
* 错误码 * 错误码
*/ */
@JSONField(ordinal = 1) @JSONField(ordinal = 1)
@ApiModelProperty(value = "code",notes = "响应码",example = "200")
private Integer code; private Integer code;
/** /**
* 提示信息 * 提示信息
*/ */
@JSONField(ordinal = 2) @JSONField(ordinal = 2)
@ApiModelProperty(value = "msg",notes = "返回响应信息",example = "success")
private String msg; private String msg;
/** /**
* 具体的内容 * 具体的内容
*/ */
@JSONField(ordinal = 3) @JSONField(ordinal = 3)
@ApiModelProperty(value = "data",notes = "实际返回数据",example = "123")
private T data; private T data;
/* 以下为返回成功响应结果的各类重载静态方法 */ /* 以下为返回成功响应结果的各类重载静态方法 */
......
...@@ -26,9 +26,9 @@ public class FileDownLoadController { ...@@ -26,9 +26,9 @@ public class FileDownLoadController {
@GetMapping("/download/{fileName}") @GetMapping("/download/{fileName}")
@ApiOperation(value = "文件下载",notes = "通过文件名称下载文件") @ApiOperation(value = "文件下载",notes = "通过文件名称下载文件")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "fileName",value = "文件名称",paramType = "String",example = "1.zip",required = true), @ApiImplicitParam(name = "fileName",value = "文件名称",paramType = "query",example = "1.zip",required = true),
@ApiImplicitParam(name = "response",value = "响应对象",paramType = "HttpServletResponse",required = true), @ApiImplicitParam(name = "response",value = "响应对象",paramType = "query",required = true),
@ApiImplicitParam(name = "request",value = "请求对象",paramType = "HttpServletRequest",required = true), @ApiImplicitParam(name = "request",value = "请求对象",paramType = "query",required = true),
}) })
public void fileDownLoad(@PathVariable("fileName") String fileName, HttpServletResponse response, HttpServletRequest request){ public void fileDownLoad(@PathVariable("fileName") String fileName, HttpServletResponse response, HttpServletRequest request){
......
package com.zjty.efs.ftp.controller; package com.zjty.efs.ftp.controller;
import com.zjty.efs.ftp.base.response.ServerResponse; import com.zjty.efs.ftp.base.response.ServerResponse;
import com.zjty.efs.ftp.entity.MergeRequest;
import com.zjty.efs.ftp.entity.UploadRequest;
import com.zjty.efs.ftp.service.FileUploadService; import com.zjty.efs.ftp.service.FileUploadService;
import com.zjty.efs.misc.config.AutoDocument; import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -12,6 +14,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -12,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
@AutoDocument @AutoDocument
@RestController @RestController
...@@ -36,7 +39,7 @@ public class FileUploadController { ...@@ -36,7 +39,7 @@ public class FileUploadController {
@ResponseBody @ResponseBody
@ApiOperation(value = "文件检查",notes = "检查文件存在与否") @ApiOperation(value = "文件检查",notes = "检查文件存在与否")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "String",required = true) @ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "query",required = true)
}) })
public ServerResponse checkFile(@RequestParam(value = "md5File") String md5File) { public ServerResponse checkFile(@RequestParam(value = "md5File") String md5File) {
return fileUploadService.checkFile(md5File); return fileUploadService.checkFile(md5File);
...@@ -50,8 +53,8 @@ public class FileUploadController { ...@@ -50,8 +53,8 @@ public class FileUploadController {
@ResponseBody @ResponseBody
@ApiOperation(value = "分片检查",notes = "检查分片存不存在") @ApiOperation(value = "分片检查",notes = "检查分片存不存在")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "String",required = true), @ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "query",required = true),
@ApiImplicitParam(name = "chunk",value = "分片名称",paramType = "Integer",required = true) @ApiImplicitParam(name = "chunk",value = "分片名称",paramType = "query",required = true)
}) })
public ServerResponse checkChunk(@RequestParam(value = "md5File") String md5File, public ServerResponse checkChunk(@RequestParam(value = "md5File") String md5File,
@RequestParam(value = "chunk") Integer chunk) { @RequestParam(value = "chunk") Integer chunk) {
...@@ -63,17 +66,12 @@ public class FileUploadController { ...@@ -63,17 +66,12 @@ public class FileUploadController {
* 修改上传 * 修改上传
*/ */
@PostMapping("/upload") @PostMapping("/upload")
@ResponseBody
@ApiOperation(value = "文件上传",notes = "上传文件,支持断点续传") @ApiOperation(value = "文件上传",notes = "上传文件,支持断点续传")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "String",required = true), @ApiImplicitParam(name = "uploadRequests",value = "上传文件的集合",paramType = "query",required = true)
@ApiImplicitParam(name = "chunk",value = "分片名称",paramType = "Integer",required = true),
@ApiImplicitParam(name = "file",value = "文件",paramType = "MultipartFile",required = true)
}) })
public ServerResponse upload(@RequestParam(value = "file") MultipartFile file, public ServerResponse upload(@RequestBody List<UploadRequest> uploadRequests) { //第几片,从0开始
@RequestParam(value = "md5File") String md5File, return fileUploadService.upload(uploadRequests);
@RequestParam(value = "chunk",required= false) Integer chunk) { //第几片,从0开始
return fileUploadService.upload(file,md5File,chunk);
} }
/** /**
...@@ -81,17 +79,12 @@ public class FileUploadController { ...@@ -81,17 +79,12 @@ public class FileUploadController {
* 合成分片 * 合成分片
*/ */
@PostMapping("/merge") @PostMapping("/merge")
@ResponseBody
@ApiOperation(value = "合成分片",notes = "合成所有分片") @ApiOperation(value = "合成分片",notes = "合成所有分片")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "String",required = true), @ApiImplicitParam(name = "mergeRequests",value = "需要分片合成的集合",paramType = "query",required = true)
@ApiImplicitParam(name = "chunk",value = "最后的分片名称",paramType = "Integer",required = true),
@ApiImplicitParam(name = "file",value = "文件",paramType = "MultipartFile",required = true)
}) })
public ServerResponse merge(@RequestParam(value = "chunks",required =false) Integer chunks, public ServerResponse merge(@RequestBody List<MergeRequest> mergeRequests){
@RequestParam(value = "md5File") String md5File, return fileUploadService.merge(mergeRequests);
@RequestParam(value = "name") String name){
return fileUploadService.merge(chunks,md5File,name);
} }
} }
package com.zjty.efs.ftp.entity;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CheckChunkRequest {
@ApiModelProperty(value = "md5File",notes = "md5生成的文件夹名称")
private String md5File;
@ApiModelProperty(value = "chunk",notes = "当前分片")
private Integer chunk;
}
package com.zjty.efs.ftp.entity;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CheckChunkResponse {
@ApiModelProperty(value = "md5File",notes = "md5生成的文件夹名称")
private String md5File;
@ApiModelProperty(value = "chunk",notes = "当前分片")
private Integer chunk;
@ApiModelProperty(value = "exist",notes = "是否存在 0-不存在 1-存在")
private Integer exist;
}
package com.zjty.efs.ftp.entity;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public class MergeRequest {
@ApiModelProperty(value = "name",notes = "合成后的文件名称")
private String name;//文件
@ApiModelProperty(value = "md5File",notes = "MD5生成的文件夹名称",example = "fc44454f994403b01b40895f0a6535b5")
private String md5File;//md5文件
@ApiModelProperty(value = "chuck",notes = "当前分片",example = "1")
private Integer chuck;//分片
}
package com.zjty.efs.ftp.entity; package com.zjty.efs.ftp.entity;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@AutoDocument
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public class FileReturn { public class MergeResponse {
@ApiModelProperty(value = "name",notes = "上传文件名称",example = "1.zip")
private String name;//上传文件的名称 private String name;//上传文件的名称
@ApiModelProperty(value = "path",notes = "上传文件服务器中存储地址",example = "D://file/uploads/1.zip")
private String path;//上传文件的地址 private String path;//上传文件的地址
@ApiModelProperty(value = "saveSuccess",notes = "文件保存是否成功 0-失败 1-成功",example = "1")
private int saveSuccess;//文件保存是否成功 0-失败 1-成功
} }
package com.zjty.efs.ftp.entity;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public class UploadRequest {
@ApiModelProperty(value = "multipartFile",notes = "文件数据")
private MultipartFile multipartFile;//文件
@ApiModelProperty(value = "md5File",notes = "MD5生成的文件夹名称",example = "fc44454f994403b01b40895f0a6535b5")
private String md5File;//md5文件
@ApiModelProperty(value = "chuck",notes = "当前分片",example = "1")
private Integer chuck;//分片
}
...@@ -2,9 +2,13 @@ package com.zjty.efs.ftp.service; ...@@ -2,9 +2,13 @@ package com.zjty.efs.ftp.service;
import com.zjty.efs.ftp.base.response.ServerResponse; import com.zjty.efs.ftp.base.response.ServerResponse;
import com.zjty.efs.ftp.entity.CheckChunkRequest;
import com.zjty.efs.ftp.entity.MergeRequest;
import com.zjty.efs.ftp.entity.UploadRequest;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
public interface FileUploadService { public interface FileUploadService {
...@@ -25,18 +29,18 @@ public interface FileUploadService { ...@@ -25,18 +29,18 @@ public interface FileUploadService {
* @author zs * @author zs
* 检查分片存不存在 * 检查分片存不存在
*/ */
ServerResponse checkChunk(String md5File, Integer chunk); ServerResponse checkChunk(List<CheckChunkRequest> checkChunkRequests);
/** /**
* @author zs * @author zs
* 修改上传 * 修改上传
*/ */
ServerResponse upload(MultipartFile file, String md5File, Integer chunk); ServerResponse upload(List<UploadRequest> uploadRequests);
/** /**
* @author zs * @author zs
* 合成分片 * 合成分片
*/ */
ServerResponse merge(Integer chunks, String md5File, String name); ServerResponse merge(List<MergeRequest> uploadRequests);
} }
package com.zjty.efs.ftp.service.impl; package com.zjty.efs.ftp.service.impl;
import com.zjty.efs.ftp.base.response.ServerResponse; import com.zjty.efs.ftp.base.response.ServerResponse;
import com.zjty.efs.ftp.entity.FileReturn; import com.zjty.efs.ftp.entity.*;
import com.zjty.efs.ftp.service.FileUploadService; import com.zjty.efs.ftp.service.FileUploadService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -30,14 +30,14 @@ public class FileUploadServiceImpl implements FileUploadService { ...@@ -30,14 +30,14 @@ public class FileUploadServiceImpl implements FileUploadService {
@Override @Override
public ServerResponse fileUpload(HttpServletRequest request) { public ServerResponse fileUpload(HttpServletRequest request) {
List<MultipartFile> multipartFiles = ((MultipartHttpServletRequest)request).getFiles("file"); List<MultipartFile> multipartFiles = ((MultipartHttpServletRequest)request).getFiles("file");
List<FileReturn> fileReturns = new ArrayList<>(); List<MergeResponse> fileReturns = new ArrayList<>();
if(multipartFiles != null && multipartFiles.size() != 0){ if(multipartFiles != null && multipartFiles.size() != 0){
for(MultipartFile multipartFile:multipartFiles){ for(MultipartFile multipartFile:multipartFiles){
InputStream is = null; InputStream is = null;
BufferedInputStream bis = null; BufferedInputStream bis = null;
FileOutputStream fos = null; FileOutputStream fos = null;
BufferedOutputStream bos = null; BufferedOutputStream bos = null;
FileReturn fileReturn = new FileReturn(); MergeResponse fileReturn = new MergeResponse();
String sourceName = multipartFile.getOriginalFilename(); String sourceName = multipartFile.getOriginalFilename();
String suffix = sourceName.substring(sourceName.lastIndexOf(".")); String suffix = sourceName.substring(sourceName.lastIndexOf("."));
String fileName = UUID.randomUUID().toString() + suffix; String fileName = UUID.randomUUID().toString() + suffix;
...@@ -94,79 +94,113 @@ public class FileUploadServiceImpl implements FileUploadService { ...@@ -94,79 +94,113 @@ public class FileUploadServiceImpl implements FileUploadService {
} }
@Override @Override
public ServerResponse checkChunk(String md5File, Integer chunk) { public ServerResponse checkChunk(List<CheckChunkRequest> checkChunkRequests) {
Boolean exist = false; List<CheckChunkResponse> chunkResponses = new ArrayList<>();
//String path = "D:/webuploader/"+md5File+"/"; if(checkChunkRequests != null && checkChunkRequests.size() != 0){
String chunkPath = fileAddress + "/" + md5File + "/";//分片存放目录 for(CheckChunkRequest chunkRequest:checkChunkRequests){
String chunkName = chunk+ ".tmp";//分片名 String md5File = chunkRequest.getMd5File();
File file = new File(chunkPath + chunkName); Integer chunk = chunkRequest.getChunk();
if (file.exists()) { CheckChunkResponse chunkResponse = new CheckChunkResponse();
exist = true; chunkResponse.setChunk(chunk);
chunkResponse.setMd5File(md5File);
Integer exist = 0;
String chunkPath = fileAddress + "/" + md5File + "/";//分片存放目录
String chunkName = chunk+ ".tmp";//分片名
File file = new File(chunkPath + chunkName);
if (file.exists()) {
exist = 1;
}
chunkResponse.setExist(exist);
}
} }
return ServerResponse.success(exist); return ServerResponse.success(chunkResponses);
} }
@Override @Override
public ServerResponse upload(MultipartFile file, String md5File, Integer chunk) { public ServerResponse upload(List<UploadRequest> uploadRequests) {
//String path = "D:/webuploader/"+md5File+"/"; if(uploadRequests != null && uploadRequests.size() != 0){
String chunkPath = fileAddress + "/" + md5File + "/";//分片存放目录 for(UploadRequest uploadRequest:uploadRequests){
File dirFile = new File(chunkPath); String md5File = uploadRequest.getMd5File();
if (!dirFile.exists()) {//目录不存在,创建目录 Integer chunk = uploadRequest.getChuck();
dirFile.mkdirs(); MultipartFile file = uploadRequest.getMultipartFile();
} String chunkPath = fileAddress + "/" + md5File + "/";//分片存放目录
String chunkName; File dirFile = new File(chunkPath);
if(chunk == null) {//表示是小文件,还没有一片 if (!dirFile.exists()) {//目录不存在,创建目录
chunkName = "0.tmp"; dirFile.mkdirs();
}else { }
chunkName = chunk+ ".tmp"; String chunkName;
} if(chunk == null) {//表示是小文件,还没有一片
String filePath = chunkPath + chunkName; chunkName = "0.tmp";
File saveFile = new File(filePath); }else {
try { chunkName = chunk + ".tmp";
if (!saveFile.exists()) { }
saveFile.createNewFile();//文件不存在,则创建 String filePath = chunkPath + chunkName;
File saveFile = new File(filePath);
try {
if (!saveFile.exists()) {
saveFile.createNewFile();//文件不存在,则创建
}
file.transferTo(saveFile);//将文件保存
} catch (IOException e) {
log.error(filePath + "文件没有保存");
}
} }
file.transferTo(saveFile);//将文件保存
} catch (IOException e) {
return ServerResponse.error("false");
} }
return ServerResponse.success("true"); return ServerResponse.success("true");
} }
@Override @Override
public ServerResponse merge(Integer chunks, String md5File, String name) { public ServerResponse merge(List<MergeRequest> uploadRequests) {
FileOutputStream fileOutputStream = null; //合成后的文件 List<MergeResponse> fileReturns = new ArrayList<>();
try { if(uploadRequests != null && uploadRequests.size() != 0){
fileOutputStream = new FileOutputStream(fileAddress + "/" + name); for(MergeRequest mergeRequest: uploadRequests){
} catch (FileNotFoundException e) { MergeResponse fileReturn = new MergeResponse();
e.printStackTrace(); String md5File = mergeRequest.getMd5File();
} Integer chunks = mergeRequest.getChuck();
try { String name = mergeRequest.getName();
byte[] buf = new byte[1024]; fileReturn.setName(name);//放入文件名称
for(long i = 0;i < chunks;i++) { fileReturn.setPath(fileAddress + "/" + name);//文件存储地址
String chunkFile = i+".tmp"; fileReturn.setSaveSuccess(1);//默认保存成功,如果失败,重新set为0
File file = new File(fileAddress + "/" + md5File+"/" + chunkFile); FileOutputStream fileOutputStream = null; //合成后的文件
InputStream inputStream = new FileInputStream(file); try {
int len = 0; fileOutputStream = new FileOutputStream(fileAddress + "/" + name);
while((len = inputStream.read(buf)) != -1){ } catch (FileNotFoundException e) {
fileOutputStream.write(buf,0,len); e.printStackTrace();
}
try {
byte[] buf = new byte[1024];
for(long i = 0;i < chunks;i++) {
String chunkFile = i + ".tmp";
File file = new File(fileAddress + "/" + md5File+"/" + chunkFile);
InputStream inputStream = new FileInputStream(file);
int len = 0;
while((len = inputStream.read(buf)) != -1){
fileOutputStream.write(buf,0,len);
}
inputStream.close();
}
//删除md5目录,及临时文件
deleteFile(new File(fileAddress + "/" + md5File));
} catch (Exception e) {
fileReturn.setSaveSuccess(0);//保存失败
log.error(fileReturn.getPath() + "文件保存失败");
}finally {
try {
fileReturns.add(fileReturn);
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
inputStream.close();
}
//删除md5目录,及临时文件
deleteFile(new File(fileAddress + "/" + md5File));
} catch (Exception e) {
return ServerResponse.error("false");
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
} }
} }
return ServerResponse.success("true"); return ServerResponse.success(fileReturns);
} }
/**
* 删除文件夹下所有文件以及文件夹
* @param file
*/
public static void deleteFile(File file){ public static void deleteFile(File file){
//判断文件不为null或文件目录存在 //判断文件不为null或文件目录存在
if (file == null || !file.exists()){ if (file == null || !file.exists()){
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论