package com.baihua.controller;
import com.baihua.common.Constants;
import com.baihua.common.Result;
import com.baihua.exception.MyException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@RestController
@RequestMapping("file")
@Slf4j
public class FileController {
private String uploadPath = "E:\\Jack_he\\upload\\files\\";
private String downloadPath = "http://localhost:8086/file/download?fileName=";
@PostMapping("upload")
public Result upload(@RequestParam("file") MultipartFile multipartFile) {
if (multipartFile.isEmpty()) {
throw new MyException(Constants.CODE_10400, "文件为空,请重新上传");
}
String originalFilename = multipartFile.getOriginalFilename();
File file = new File(uploadPath + originalFilename);
if (!file.exists()) {
file.mkdirs();
}
try {
multipartFile.transferTo(file);
} catch (IOException e) {
log.error("上传失败:{}", e);
throw new MyException(Constants.CODE_10400, "文件上传失败");
}
Result result = new Result();
result.setCode(Constants.CODE_0);
result.setMsg("success");
result.setData(downloadPath + originalFilename);
return result;
}
@GetMapping("download")
public void download(HttpServletResponse resp, @RequestParam String fileName) throws IOException {
if (StringUtils.isEmpty(fileName)) {
throw new MyException(Constants.CODE_10300, "参数错误");
}
String readPath = uploadPath + fileName;
FileInputStream is = new FileInputStream(readPath);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] bytes = new byte[8 * 1024];
int len = 0;
OutputStream os = resp.getOutputStream();
resp.setContentType("application/octet-stream");
try {
String encode = URLEncoder.encode(fileName, "UTF-8");
resp.setHeader("Content-Disposition", "attachment;fileName=" + encode);
while ((len = bis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
} catch (UnsupportedEncodingException e) {
log.error("解决中文乱码异常:{}", e);
throw new MyException(Constants.CODE_10400, "解决中文乱码异常");
} catch (IOException e) {
log.error("I/O流写出时发生异常:{}", e);
throw new MyException(Constants.CODE_10400, "I/O流写出时发生异常");
}finally {
if (is != null) {
is.close();
}
if (bis != null) {
bis.close();
}
if (os != null) {
os.close();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义