我们查看后台FileController 这里对文件上传的接口进行了统一的管理:
@RestController
@RequestMapping("/admin/file")
public class FileController {
@Autowired
private AttachFileService attachFileService;
@PostMapping("/upload/element")
public ResponseEntity<String> uploadElementFile(@RequestParam("file") MultipartFile file) throws IOException{
if(file.isEmpty()){
return ResponseEntity.noContent().build();
}
String fileName = attachFileService.uploadFile(file.getBytes(),file.getOriginalFilename());
return ResponseEntity.ok(fileName);
}
}
同时我们查看attachFileService 的实现类,可以知道该文件上传是根据配置,上传到不同地方的
@Service
public class AttachFileServiceImpl extends ServiceImpl<AttachFileMapper, AttachFile> implements AttachFileService {
private void upload(byte[] bytes, String filePath) throws IOException {
// 如果开启了七牛云就上传到七牛云
Qiniu qiniu = shopConfig.getQiniu();
if (qiniu.getIsOpen()) {
String upToken = auth(qiniu).uploadToken(qiniu.getBucket(),filePath);
uploadManager(qiniu).put(bytes, filePath, upToken);
return;
}
// 如果开启了阿里云就上传到阿里云
AliOss aliOss = shopConfig.getAliOss();
if (aliOss.getIsOpen()) {
OSS ossClient = new OSSClientBuilder().build(aliOss.getEndpoint(), aliOss.getAccessKeyId(), aliOss.getAccessKeySecret());
try {
InputStream input = new ByteArrayInputStream(bytes);
ossClient.putObject(new PutObjectRequest(aliOss.getBucketName(), filePath, input));
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getMessage());
} finally {
ossClient.shutdown();
}
return;
}
}
}
当然,上面只是实现的代码而已,所以配置在哪配置呢?
答:需要配置挺多地方的
2.url的配置
2.1 修改文件资源服务器域名
2.2 修改后台vue项目,修改图片域名,也就是管理系统(mall4vs-bbc、mall4vp-bbc)
开发环境: static/config/index.js
生产环境: static/config/index-prod.js
如图:
window.SITE_CONFIG['resourcesUrl'] = 'http://img-test.mall4j.com/'
2.3 修改uniapp图片域名(mall4uni-bbc)
utils/config.js
2.4 用户pc端,无需修改
文件上传因为要经过服务器,而nginx的有限制文件上传大小的配置,这时需要配置nginx文件上传大小
client_max_body_size 20m;
spring boot 使用的web容器为tomcat的时候,每次上传会上传到一个临时的文件夹中,而linux系统会在30天后删除该文件夹,导致文件上传异常。此时需要在配置文件配置临时上传的文件夹
我们在application.yml指定了这个文件夹为linux系统的默认临时文件夹,解决了这个问题。
server:
tomcat:
basedir: /temp