@PostMapping("/uploadFileTest1")
@ApiOperation("上传图片1")
public ViewResultData uploadFileTest1(@RequestPart("upFile") MultipartFile upFile){
String filePathName = "F:/file/uploadPath" + File.separator + upFile.getOriginalFilename();
File file = new File(filePathName);
try {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
upFile.transferTo(file);
return new ViewResultData(ReturnCode.SUCCESS_000000,"图片上传成功");
} catch (IOException e) {
e.printStackTrace();
}
return new ViewResultData(ReturnCode.SUCCESS_000000,"图片上传失败");
}


java.io.IOException: java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\tomcat.8993.6340478007086561314\work\Tomcat\localhost\ROOT\upload_aaf3bf6d_b6ba_4888_91ae_ab07ba25701e_00000000.tmp (系统找不到指定的文件。)
at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122)

FileCopyUtils.copy(file1,file2);
代码如下:

/**
* byte[]类型转File
* @param bytes
* @param uploadPath 文件输出目录
* @param fileName 文件名
* @return
*/
public static File bytesToFile(byte[] bytes, String uploadPath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
file = createNewFile(uploadPath,fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return file;
}
/**
* 创建文件
* @param uploadPath
* @param fileName
* @return
* @throws IOException
*/
public static final File createNewFile(String uploadPath, String fileName) throws IOException {
File file = new File(uploadPath + File.separator + fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
return file;
}

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.4.0version>
dependency>



"fileDownUrl": "http://127.0.0.1:8993/pet/file/upAndDown/downFile/20221012/b0a3164b6c94fe6c9d8b857bb75509fe.png",启动服务,地址栏输入此链接即可下载file:
basePath: "/file/images/uploadPath"
domain: "http://127.0.0.1:8993"
downPath : "/pet/file/upAndDown/downFile"
package com.liu.susu.pojo.vo;
import lombok.Data;
/**
* description
* @author susu
**/
@Data
public class FileVo {
private String fileName;
private String fileUpPath;
private String fileDownUrl;
}
① FileUtils.java
package com.liu.susu.utils.file;
import com.liu.susu.utils.DateUtils;
import com.liu.susu.utils.Md5Utils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* description
* @author susu
**/
public class FileUtils {
/**
* 创建文件
* @param uploadPath
* @param fileName
* @return
* @throws IOException
*/
public static final File createNewFile(String uploadPath, String fileName) throws IOException {
File file = new File(uploadPath + File.separator + fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
return file;
}
/**
* byte[]类型转File
* @param bytes
* @param uploadPath 文件输出目录
* @param fileName 文件名
* @return
*/
public static File bytesToFile(byte[] bytes, String uploadPath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
file = createNewFile(uploadPath,fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return file;
}
/**
* 对文件进行编码
* @param file
* @return
*/
public static final String GetCodingFileName(MultipartFile file) {
String fileName = file.getOriginalFilename();
String fileExtension = getFileExtension(file);
fileName = DateUtils.getDatePath() + "/" + GetMd5EncodingFileName(fileName)
+ "." + fileExtension;
return fileName;
}
/**
* 获取文件的扩展名
* @param file
* @return 文件的扩展名
*/
public static final String getFileExtension(MultipartFile file) {
String fileExtension = FilenameUtils.getExtension(file.getOriginalFilename());
if (StringUtils.isEmpty(fileExtension)) {
fileExtension = FileTypeUtils.getExtension(file.getContentType());
}
return fileExtension;
}
/**
* 对文件名进行编码
* @param fileName
* @return
*/
private static final String GetMd5EncodingFileName(String fileName) {
fileName = fileName.replace("_", " ");
return Md5Utils.hash(fileName + System.nanoTime() + RandomStringUtils.randomNumeric(3));
}
}
② FileTypeUtils.java
package com.liu.susu.utils.file;
public class FileTypeUtils {
public static final String IMAGE_PNG = "image/png";
public static final String IMAGE_JPG = "image/jpg";
public static final String IMAGE_JPEG = "image/jpeg";
public static final String IMAGE_GIF = "image/gif";
public static String getExtension(String prefix) {
switch (prefix) {
case IMAGE_PNG:
return "png";
case IMAGE_JPG:
return "jpg";
case IMAGE_JPEG:
return "jpeg";
case IMAGE_GIF:
return "gif";
default:
return "";
}
}
}
③ DateUtils.java
package com.liu.susu.utils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* description
* @author susu
**/
public class DateUtils {
public static final String getDatePath() {
LocalDate localDate = LocalDate.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
return localDate.format(df);
}
}
④ Md5Utils.java
参考:https://gitee.com/calvinhwang123/RuoYi-Process.
package com.liu.susu.utils;
import lombok.extern.slf4j.Slf4j;
import java.security.MessageDigest;
@Slf4j
public class Md5Utils {
private static byte[] md5(String s) {
MessageDigest algorithm;
try {
algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(s.getBytes("UTF-8"));
byte[] messageDigest = algorithm.digest();
return messageDigest;
} catch (Exception e) {
log.error("MD5 Error...", e);
}
return null;
}
private static final String toHex(byte hash[]) {
if (hash == null) {
return null;
}
StringBuffer buf = new StringBuffer(hash.length * 2);
int i;
for (i = 0; i < hash.length; i++) {
if ((hash[i] & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString(hash[i] & 0xff, 16));
}
return buf.toString();
}
public static String hash(String s) {
try {
return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
} catch (Exception e) {
log.error("not supported charset...{}", e);
return s;
}
}
}
service
package com.liu.susu.service.file;
import com.liu.susu.pojo.vo.FileVo;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* description 图片上传下载
* @author susu
**/
public interface MyFileService {
FileVo uploadMultipartFile(MultipartFile upFile) throws IOException;
}
package com.liu.susu.service.file;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.liu.susu.pojo.vo.FileVo;
import com.liu.susu.utils.DateUtils;
import com.liu.susu.utils.file.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
/**
* description 图片上传下载
* @author susu
**/
@Service
public class MyFileServiceImpl implements MyFileService{
@Value("${file.basePath}")
private String basePath ;
@Value("${file.domain}")
private String domain;
@Value("${file.downPath}")
private String downPath;
public FileVo uploadMultipartFile(MultipartFile upFile) throws IOException {
byte[] bytes = IoUtil.readBytes(upFile.getInputStream());
String codingFileNameWithDate = FileUtils.GetCodingFileName(upFile);
// String filePathAndName = basePath + File.separator + codingFileNameWithDate;
String filePathAndName = basePath + "/" + codingFileNameWithDate;
FileUtil.writeBytes(bytes, filePathAndName);
FileVo fileVo = new FileVo();
fileVo.setFileName(upFile.getOriginalFilename());
fileVo.setFileUpPath(filePathAndName);
fileVo.setFileDownUrl(domain + downPath + "/" + codingFileNameWithDate);
return fileVo;
}
}
controller->FileUpAndDownController.java
package com.liu.susu.controller.file;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liu.susu.common.ReturnCode;
import com.liu.susu.common.ViewResultData;
import com.liu.susu.pojo.vo.FileVo;
import com.liu.susu.service.file.MyFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
* description 上传、下载图片
* @author susu
**/
@RestController
@RequestMapping("/pet/file/upAndDown")
@Slf4j
@Api(tags = "上传、下载图片")
@ApiSupport(author = "披荆斩棘",order = 8)
public class FileUpAndDownController {
@Autowired
private MyFileService fileService;
@Value("${file.basePath}")
private String basePath ;
@PostMapping("/uploadFile")
@ApiOperation("上传图片")
public ViewResultData uploadFile(@RequestPart("upFile") MultipartFile upFile){
try {
FileVo fileVo = fileService.uploadMultipartFile(upFile);
return new ViewResultData(ReturnCode.SUCCESS_000000,fileVo);
} catch (IOException e) {
e.printStackTrace();
}
return new ViewResultData(ReturnCode.FAIL_999999,"图片上传失败");
}
@GetMapping("/downFile/{fileDate}/{fileName}")
@ApiOperation("下载传图片")
public void downFile(HttpServletResponse response,
@PathVariable(value = "fileDate",required = true) String fileDate,
@PathVariable(value = "fileName",required = true) String fileName){
//根据fileName查寻到filePath
String filePath = basePath + "/" + fileDate + "/" +fileName;
byte[] bytes = FileUtil.readBytes(filePath);
if (bytes == null) {
log.info("下载的文件不存在");
response.setStatus(HttpStatus.NOT_FOUND.value());
return;
}
try {
// 设置 header 和 contentType
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
// 输出文件
IoUtil.write(response.getOutputStream(), false, bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}