Skip to content

Commit

Permalink
✨ spring-boot-demo-upload 完成
Browse files Browse the repository at this point in the history
  • Loading branch information
xkcoding committed Nov 6, 2018
1 parent 18aef34 commit da7d619
Show file tree
Hide file tree
Showing 6 changed files with 371 additions and 32 deletions.
6 changes: 6 additions & 0 deletions spring-boot-demo-upload/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.xkcoding.upload.controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qiniu.http.Response;
import com.xkcoding.upload.service.IQiNiuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
* <p>
* 文件上传 Controller
* </p>
*
* @package: com.xkcoding.upload.controller
* @description: 文件上传 Controller
* @author: yangkai.shen
* @date: Created in 2018/11/6 16:33
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@RestController
@Slf4j
@RequestMapping("/upload")
public class UploadController {
@Value("${spring.servlet.multipart.location}")
private String fileTempPath;

@Value("${qiniu.prefix}")
private String prefix;

private final IQiNiuService qiNiuService;

@Autowired
public UploadController(IQiNiuService qiNiuService) {
this.qiNiuService = qiNiuService;
}

@PostMapping(value = "/local", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Dict local(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return Dict.create().set("code", 400).set("message", "文件内容为空");
}
String fileName = file.getOriginalFilename();
String rawFileName = StrUtil.subBefore(fileName, ".", true);
String fileType = StrUtil.subAfter(fileName, ".", true);
String localFilePath = StrUtil.appendIfMissing(fileTempPath, "/") + rawFileName + "-" + DateUtil.current(false) + "." + fileType;
try {
file.transferTo(new File(localFilePath));
} catch (IOException e) {
log.error("【文件上传至本地】失败,绝对路径:{}", localFilePath);
return Dict.create().set("code", 500).set("message", "文件上传失败");
}

log.info("【文件上传至本地】绝对路径:{}", localFilePath);
return Dict.create().set("code", 200).set("message", "上传成功").set("data", Dict.create().set("fileName", fileName).set("filePath", localFilePath));
}

@PostMapping(value = "/yun", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Dict yun(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return Dict.create().set("code", 400).set("message", "文件内容为空");
}
String fileName = file.getOriginalFilename();
String rawFileName = StrUtil.subBefore(fileName, ".", true);
String fileType = StrUtil.subAfter(fileName, ".", true);
String localFilePath = StrUtil.appendIfMissing(fileTempPath, "/") + rawFileName + "-" + DateUtil.current(false) + "." + fileType;
try {
file.transferTo(new File(localFilePath));
Response response = qiNiuService.uploadFile(new File(localFilePath));
if (response.isOK()) {
JSONObject jsonObject = JSONUtil.parseObj(response.bodyString());

String yunFileName = jsonObject.getStr("key");
String yunFilePath = StrUtil.appendIfMissing(prefix, "/") + yunFileName;

FileUtil.del(new File(localFilePath));

log.info("【文件上传至七牛云】绝对路径:{}", yunFilePath);
return Dict.create().set("code", 200).set("message", "上传成功").set("data", Dict.create().set("fileName", yunFileName).set("filePath", yunFilePath));
} else {
log.error("【文件上传至七牛云】失败,{}", JSONUtil.toJsonStr(response));
FileUtil.del(new File(localFilePath));
return Dict.create().set("code", 500).set("message", "文件上传失败");
}
} catch (IOException e) {
log.error("【文件上传至七牛云】失败,绝对路径:{}", localFilePath);
return Dict.create().set("code", 500).set("message", "文件上传失败");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.xkcoding.upload.service;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;

import java.io.File;

/**
* <p>
* 七牛云上传Service
* </p>
*
* @package: com.xkcoding.upload.service
* @description: 七牛云上传Service
* @author: yangkai.shen
* @date: Created in 2018/11/6 17:21
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
public interface IQiNiuService {
/**
* 七牛云上传文件
*
* @param file 文件
* @return 七牛上传Response
* @throws QiniuException 七牛异常
*/
Response uploadFile(File file) throws QiniuException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.xkcoding.upload.service.impl;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.xkcoding.upload.service.IQiNiuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;

/**
* <p>
* 七牛云上传Service
* </p>
*
* @package: com.xkcoding.upload.service.impl
* @description: 七牛云上传Service
* @author: yangkai.shen
* @date: Created in 2018/11/6 17:22
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@Service
@Slf4j
public class QiNiuServiceImpl implements IQiNiuService, InitializingBean {
private final UploadManager uploadManager;

private final Auth auth;

@Value("${qiniu.bucket}")
private String bucket;

private StringMap putPolicy;

@Autowired
public QiNiuServiceImpl(UploadManager uploadManager, Auth auth) {
this.uploadManager = uploadManager;
this.auth = auth;
}

/**
* 七牛云上传文件
*
* @param file 文件
* @return 七牛上传Response
* @throws QiniuException 七牛异常
*/
@Override
public Response uploadFile(File file) throws QiniuException {
Response response = this.uploadManager.put(file, file.getName(), getUploadToken());
int retry = 0;
while (response.needRetry() && retry < 3) {
response = this.uploadManager.put(file, file.getName(), getUploadToken());
retry++;
}
return response;
}

@Override
public void afterPropertiesSet() {
this.putPolicy = new StringMap();
putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"width\":$(imageInfo.width), \"height\":${imageInfo.height}}");
}

/**
* 获取上传凭证
*
* @return 上传凭证
*/
private String getUploadToken() {
return this.auth.uploadToken(bucket, null, 3600, putPolicy);
}
}
10 changes: 8 additions & 2 deletions spring-boot-demo-upload/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@ server:
servlet:
context-path: /demo
qiniu:
accessKey: ## 此处填写你自己的七牛云 access key
secretKey: ## 此处填写你自己的七牛云 secret key
## 此处填写你自己的七牛云 access key
accessKey:
## 此处填写你自己的七牛云 secret key
secretKey:
## 此处填写你自己的七牛云 bucket
bucket:
## 此处填写你自己的七牛云 域名
prefix:
spring:
servlet:
multipart:
Expand Down
Loading

0 comments on commit da7d619

Please sign in to comment.