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

swagger和批量上传

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