SpringBoot+Vue+Elementui的项目中实现用户上传图片至云服务器并且返回图片的URL
要实现用户上传图片至云服务器的功能,可以使用 Spring Boot 中的 MultipartFile类和第三方云存储服务,例如阿里云 OSS、七牛云等。下面是一个示例代码,演示如何将用户上传的图片保存到阿里云 OSS,并将图片 URL 保存到 MySQL 数据库中。
首先,创建一个上传文件的接口,用于处理用户上传的图片:
@RestController
@RequestMapping("/api/upload")
public class UploadController {
@Autowired
private OssService ossService;
@PostMapping(value = "/image")
public ResponseEntity<?> uploadImage(@RequestParam("file") MultipartFile file) {
// 上传文件并返回图片在云服务器上的 URL
String url = ossService.uploadFile(file);
// 将图片的 URL 保存到数据库
ImageEntity imageEntity = new ImageEntity();
imageEntity.setUrl(url);
imageRepository.save(imageEntity);
// 返回图片 URL 给前端
Map<String, String> response = new HashMap<>();
response.put("url", url);
return ResponseEntity.ok(response);
}
上面的代码中,@RequestParam 注解用于接收上传的文件,ossService 封装了阿里云 OSS 的相关操作,其中 uploadFile()方法可上传文件并返回文件在云服务器上的 URL。此外,创建了一个 ImageEntity 实体类,用于保存图片 URL 到数据库中。最后返回了图片的 URL 给前端。
下面是 OssService类的实现:
@Service
public class OssService {
@Autowired
private OSSClient ossClient;
@Value("${oss.bucketName}")
private String bucketName;
public String uploadFile(MultipartFile file) {
try {
String fileName = UUID.randomUUID().toString() + "-" + file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000); // 过期时间为1小时
PutObjectResult result = ossClient.putObject(bucketName, fileName, inputStream);
if (result != null) {
return "https://" + bucketName + "." + ossClient.getEndpoint().toString() + "/" + fileName;
} catch (IOException e) {
e.printStackTrace();
return null;
}
上面的代码中,ossClient 是一个阿里云 OSS 客户端,使用 bucketName指定了要上传到哪个存储桶中。uploadFile()方法中,首先生成一个唯一的文件名,然后将输入流传递给 ossClient 的 putObject()方法,该方法会上传文件并返回结果。最后返回文件在云服务器上的 URL。
最后,我们可以在前端使用图片的 URL 进行展示。例如,使用 element-ui 的 <el-image> 组件:
<el-image :src="imageUrl" />
可以在 Vue 组件中发送 Ajax 请求获取后端返回的图片 URL,然后将它保存在 data 中:
<script>
export default {
data() {
return {
imageUrl: ''
methods: {
handleUploadSuccess(res) {