package com.example.controller;
import com.example.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;
@RestController
@RequestMapping("/files")
@Slf4j
public class FileController {
@Value("${files.upload.path}")
private String basePath;
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public Result upLoad(MultipartFile file) {
//file是一个临时文件 需要转存到指定位置 否则本次请求完成后会被删除
log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成唯一文件名
String fileName = UUID.randomUUID().toString() + suffix;
//如果目录不存在 创建一个目录用于存放转存的图片
File dir = new File(basePath);
if (!dir.exists()) {
dir.mkdirs();
}
try {
//将图片转存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return Result.success(fileName);
}
/**
* 文件下载
*
* @param name
* @param response
*/
@GetMapping("/download/{name}")
public void download(@PathVariable String name, HttpServletResponse response) {
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
// response.setContentType("image/jpeg");
response.setContentType("application/octet-stream"); //流的形式下载
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在Vue中使用 例如头像上传与显示
<el-upload class="avatar-uploader" action="http://localhost:9090/files/upload" :show-file-list="false"
:on-success="handleAvatarSuccess">
<img v-if="'http://localhost:9090/files/download/'+form.avatar" :src="'http://localhost:9090/files/download/'+form.avatar" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<script>
handleAvatarSuccess(res) {
this.form.avatar = res.data
}
</script>
<el-table-column prop="image" label="图片" align="center">
<template #default="scope">
<el-image style="width: 40px; height: 40px" preview-teleported="true"
:src="'http://localhost:9090/files/download/' + scope.row.avatar"
:preview-src-list="['http://localhost:9090/files/download/'+scope.row.avatar]">
</el-image>
</template>
</el-table-column>