提交 d4cde401 authored 作者: xc's avatar xc

Merge branch 'develop' of 192.168.1.249:LJJ/encrypted-file-system

...@@ -17,6 +17,13 @@ ...@@ -17,6 +17,13 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.zjty</groupId>
<artifactId>efs-misc</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
......
...@@ -2,8 +2,15 @@ package com.zjty.efs.ftp; ...@@ -2,8 +2,15 @@ package com.zjty.efs.ftp;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication @SpringBootApplication
@ComponentScan(basePackages = {
"com.zjty.efs.misc",
"com.zjty.efs.ftp"
})
@EnableSwagger2
public class FtpApplication { public class FtpApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(FtpApplication.class, args); SpringApplication.run(FtpApplication.class, args);
......
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;
/* 以下为返回成功响应结果的各类重载静态方法 */ /* 以下为返回成功响应结果的各类重载静态方法 */
......
package com.zjty.efs.ftp.controller; package com.zjty.efs.ftp.controller;
import com.zjty.efs.ftp.service.FileDownLoadService; import com.zjty.efs.ftp.service.FileDownLoadService;
import com.zjty.efs.misc.config.AutoDocument;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
...@@ -10,13 +15,22 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -10,13 +15,22 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@AutoDocument
@RestController @RestController
@RequestMapping("/file") @RequestMapping("/file")
@Api(tags = "文件下载",description = "文件下载")
public class FileDownLoadController { public class FileDownLoadController {
@Autowired @Autowired
private FileDownLoadService fileDownLoadService; private FileDownLoadService fileDownLoadService;
@GetMapping("/downLoad/{fileName}") @GetMapping("/download/{fileName}")
@ApiOperation(value = "文件下载",notes = "通过文件名称下载文件")
@ApiImplicitParams({
@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){ public void fileDownLoad(@PathVariable("fileName") String fileName, HttpServletResponse response, HttpServletRequest request){
fileDownLoadService.fileDownLoad(fileName,response,request); fileDownLoadService.fileDownLoad(fileName,response,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.CheckChunkRequest;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
@AutoDocument
@RestController @RestController
@RequestMapping("/file") @RequestMapping("/file")
@Api(tags = "文件上传", description = "文件上传")
public class FileUploadController { public class FileUploadController {
@Autowired @Autowired
...@@ -22,4 +32,58 @@ public class FileUploadController { ...@@ -22,4 +32,58 @@ public class FileUploadController {
return fileUploadService.fileUpload(httpServletRequest); return fileUploadService.fileUpload(httpServletRequest);
} }
/**
* @author zs
* 检查文件存在与否
*/
@PostMapping("/checkFile")
@ResponseBody
@ApiOperation(value = "文件检查",notes = "检查文件存在与否")
@ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "query",required = true)
})
public ServerResponse checkFile(@RequestParam(value = "md5File") String md5File) {
return fileUploadService.checkFile(md5File);
}
/**
* @author zs
* 检查分片存不存在
*/
@PostMapping("/checkChunk")
@ApiOperation(value = "分片检查",notes = "检查分片存不存在")
@ApiImplicitParams({
@ApiImplicitParam(name = "md5File",value = "md5生成的文件名称",paramType = "query",required = true),
@ApiImplicitParam(name = "chunk",value = "分片名称",paramType = "query",required = true)
})
public ServerResponse checkChunk(@RequestBody List<CheckChunkRequest> checkChunkRequests) {
return fileUploadService.checkChunk(checkChunkRequests);
}
/**
* @author zs
* 修改上传
*/
@PostMapping("/upload")
@ApiOperation(value = "文件上传",notes = "上传文件,支持断点续传")
@ApiImplicitParams({
@ApiImplicitParam(name = "uploadRequests",value = "上传文件的集合",paramType = "query",required = true)
})
public ServerResponse upload(@RequestBody List<UploadRequest> uploadRequests) { //第几片,从0开始
return fileUploadService.upload(uploadRequests);
}
/**
* @author zs
* 合成分片
*/
@PostMapping("/merge")
@ApiOperation(value = "合成分片",notes = "合成所有分片")
@ApiImplicitParams({
@ApiImplicitParam(name = "mergeRequests",value = "需要分片合成的集合",paramType = "query",required = true)
})
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; 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,8 +2,13 @@ package com.zjty.efs.ftp.service; ...@@ -2,8 +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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
public interface FileUploadService { public interface FileUploadService {
...@@ -14,4 +19,28 @@ public interface FileUploadService { ...@@ -14,4 +19,28 @@ public interface FileUploadService {
*/ */
ServerResponse fileUpload(HttpServletRequest request); ServerResponse fileUpload(HttpServletRequest request);
/**
* @author zs
* 检查文件存在与否
*/
ServerResponse checkFile(String md5File);
/**
* @author zs
* 检查分片存不存在
*/
ServerResponse checkChunk(List<CheckChunkRequest> checkChunkRequests);
/**
* @author zs
* 修改上传
*/
ServerResponse upload(List<UploadRequest> uploadRequests);
/**
* @author zs
* 合成分片
*/
ServerResponse merge(List<MergeRequest> uploadRequests);
} }
...@@ -2,12 +2,16 @@ package com.zjty.efs.ftp.service.impl; ...@@ -2,12 +2,16 @@ package com.zjty.efs.ftp.service.impl;
import com.zjty.efs.ftp.service.FileDownLoadService; import com.zjty.efs.ftp.service.FileDownLoadService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.connector.ClientAbortException;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.net.URLEncoder;
import static javax.xml.transform.OutputKeys.ENCODING;
@Service @Service
@Slf4j @Slf4j
...@@ -16,7 +20,16 @@ public class FileDownLoadServiceImpl implements FileDownLoadService { ...@@ -16,7 +20,16 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
@Value("${file.address}") @Value("${file.address}")
private String fileAddress; private String fileAddress;
@Override /**
* 下载服务器已存在的文件
*
* @param httpServletRequest
* 请求对象
* @param response
* 响应对象
* @param fileName
* 文件名称(绝对)
*/
public void fileDownLoad(String fileName, HttpServletResponse response, HttpServletRequest httpServletRequest) { public void fileDownLoad(String fileName, HttpServletResponse response, HttpServletRequest httpServletRequest) {
if(fileName != null){ if(fileName != null){
response.setHeader("content-type", "application/octet-stream"); response.setHeader("content-type", "application/octet-stream");
...@@ -67,6 +80,89 @@ public class FileDownLoadServiceImpl implements FileDownLoadService { ...@@ -67,6 +80,89 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
} }
} }
/**
* 下载服务器已存在的文件
*
* @param request
* 请求对象
* @param response
* 响应对象
* @param fileName
* 文件名称(绝对)
*/
public void download(String fileName, HttpServletResponse response, HttpServletRequest request) {
File proposeFile = new File(fileAddress + "/" + fileName);
log.info("下载文件路径:" + proposeFile.getPath());
setFileDownloadHeader(request,response,fileName);
InputStream inputStream = null;
OutputStream bufferOut = null;
try {
// 设置响应报头
long fSize = proposeFile.length();
response.setContentType(request.getServletContext().getMimeType(fileName));
// Content-Disposition: attachment; filename=WebGoat-OWASP_Developer-5.2.zip
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"utf-8"));
// Accept-Ranges: bytes
response.setHeader("Accept-Ranges", "bytes");
long pos = 0, last = fSize - 1, sum = 0;//pos开始读取位置; last最后读取位置; sum记录总共已经读取了多少字节
if (null != request.getHeader("Range")) {
// 断点续传
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
try {
// 情景一:RANGE: bytes=2000070- 情景二:RANGE: bytes=2000070-2000970
String numRang = request.getHeader("Range").replaceAll("bytes=", "");
String[] strRange = numRang.split("-");
if (strRange.length == 2) {
pos = Long.parseLong(strRange[0].trim());
last = Long.parseLong(strRange[1].trim());
} else {
pos = Long.parseLong(numRang.replaceAll("-", "").trim());
}
} catch (NumberFormatException e) {
log.error(request.getHeader("Range") + " is not Number!");
pos = 0;
}
}
long rangLength = last - pos + 1;// 总共需要读取的字节
// Content-Range: bytes 10-1033/304974592
String contentRange = new StringBuffer("bytes ").append(pos).append("-").append(last).append("/").append(fSize).toString();
response.setHeader("Content-Range", contentRange);
// Content-Length: 1024
response.addHeader("Content-Length", String.valueOf(rangLength));
// 跳过已经下载的部分,进行后续下载
bufferOut = new BufferedOutputStream(response.getOutputStream());
inputStream = new BufferedInputStream(new FileInputStream(proposeFile));
inputStream.skip(pos);
byte[] buffer = new byte[1024];
int length = 0;
while (sum < rangLength) {
length = inputStream.read(buffer, 0, ((rangLength - sum) <= buffer.length ? ((int) (rangLength - sum)) : buffer.length));
sum = sum + length;
bufferOut.write(buffer, 0, length);
}
} catch (Throwable e) {
if (e instanceof ClientAbortException) {
// 浏览器点击取消
log.info("用户取消下载!");
} else {
log.error("下载文件失败....");
e.printStackTrace();
}
} finally {
try {
if (bufferOut != null) {
bufferOut.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/** /**
* 解决中文名称 * 解决中文名称
* @param request * @param request
......
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;
...@@ -76,9 +76,150 @@ public class FileUploadServiceImpl implements FileUploadService { ...@@ -76,9 +76,150 @@ public class FileUploadServiceImpl implements FileUploadService {
} }
} }
}else { }else {
log.info("上传失败,请重新确定key值,重新上传"); log.error("上传失败,请重新确定key值,重新上传");
return ServerResponse.error("上传失败,请重新确定key值,重新上传"); return ServerResponse.error("上传失败,请重新确定key值,重新上传");
} }
return ServerResponse.success(fileReturns); return ServerResponse.success(fileReturns);
} }
@Override
public ServerResponse checkFile(String md5File) {
Boolean exist = false;
//实际项目中,这个md5File唯一值,应该保存到数据库或者缓存中,通过判断唯一值存不存在,来判断文件存不存在,这里我就不演示了
/*if(true) {
exist = true;
}*/
return ServerResponse.success(exist);
}
@Override
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 = 1;
}
chunkResponse.setExist(exist);
}
}
return ServerResponse.success(chunkResponses);
}
@Override
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()) {//目录不存在,创建目录
dirFile.mkdirs();
}
String chunkName;
if(chunk == null) {//表示是小文件,还没有一片
chunkName = "0.tmp";
}else {
chunkName = chunk + ".tmp";
}
String filePath = chunkPath + chunkName;
File saveFile = new File(filePath);
try {
if (!saveFile.exists()) {
saveFile.createNewFile();//文件不存在,则创建
}
file.transferTo(saveFile);//将文件保存
} catch (IOException e) {
log.error(filePath + "文件没有保存");
}
}
}
return ServerResponse.success("true");
}
@Override
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);
} catch (FileNotFoundException e) {
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();
}
}
}
}
return ServerResponse.success(fileReturns);
}
/**
* 删除文件夹下所有文件以及文件夹
* @param file
*/
public static void deleteFile(File file){
//判断文件不为null或文件目录存在
if (file == null || !file.exists()){
System.out.println("文件删除失败,请检查文件路径是否正确");
return;
}
//取得这个目录下的所有子文件对象
File[] files = file.listFiles();
//遍历该目录下的文件对象
for (File f: files){
//打印文件名
//判断子目录是否存在子目录,如果是文件则删除
if (f.isDirectory()){
deleteFile(f);
}else {
f.delete();
}
}
//删除空文件夹 for循环已经把上一层节点的目录清空。
file.delete();
}
} }
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
<dependencies> <dependencies>
<!--swagger2 enable dependency--> <!--swagger2 enable dependency-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId> <artifactId>spring-boot-configuration-processor</artifactId>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论