SpringBoot上傳文件到七牛雲

準備工做

maven

pom.xml添加七牛雲的sdk依賴java

<dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.27</version>
        </dependency>
複製代碼

配置項

七牛雲上傳必要的配置有:accessKey、secretKey、bucket 其中accessKey、secretKey在該網址可查看web

portal.qiniu.com/user/keyspring

bucket爲你的存儲空間名,以下: 微信

image.png


實現

application.yml配置

upload:
 qiniu:
 domain: 填你的域名
 access-key: 你的accesskey
 secret-key: 你的secretKey
 bucket: 你的存儲空間名,我這裏爲colablog
複製代碼

能夠看到個人七牛雲上傳配置中有domain這項配置,這個配置是七牛雲buket的存儲域名,在內容管理下,主要用於上傳文件成功後把文件訪問路徑返還回去。 app

image.png
可是這個域名是限時30天使用的,因此你最好綁定一個新的域名。

上傳配置類

使用SpringBoot的@ConfigurationProperties@Component註解實現上傳的配置類UploadProperties, 由於上傳配置可能會有本地上傳和雲上傳或者其餘上傳的,因此該配置類我留了擴展點。由於受到了rabbitmq的配置類啓發,並且上傳的配置不會不少,因此用內部類來分割這種配置類。上傳配置類以下:dom

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/** * @author Johnson * @date 2019/12/16/ 09:35:36 */
@Component
@ConfigurationProperties(prefix = "upload")
public class UploadProperties {

    private Local local = new Local();

    public Local getLocal() {
        return local;
    }

    /** * @author: Johnson * @Date: 2019/12/16 * 本地上傳配置 */
    public class Local {
        ...
    }

    private Qiniu qiniu = new Qiniu();

    public Qiniu getQiniu() {
        return qiniu;
    }

    /** * @author: Johnson * @Date: 2019/12/16 * 七牛雲上傳配置 */
    public class Qiniu {
        /** * 域名 */
        private String domain;

        /** * 從下面這個地址中獲取accessKey和secretKey * https://portal.qiniu.com/user/key */
        private String accessKey;

        private String secretKey;

        /** * 存儲空間名 */
        private String bucket;

        public String getDomain() {
            return domain;
        }

        public void setDomain(String domain) {
            this.domain = domain;
        }

        public String getAccessKey() {
            return accessKey;
        }

        public void setAccessKey(String accessKey) {
            this.accessKey = accessKey;
        }

        public String getSecretKey() {
            return secretKey;
        }

        public void setSecretKey(String secretKey) {
            this.secretKey = secretKey;
        }

        public String getBucket() {
            return bucket;
        }

        public void setBucket(String bucket) {
            this.bucket = bucket;
        }
    }
}
複製代碼

七牛雲上傳接口和類

上傳接口以下:maven

public interface UploadFile {
    String uploadFile(MultipartFile file);
}

複製代碼

上傳類ide

import cn.colablog.blogserver.utils.properties.UploadProperties;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/** * @author Johnson * @date 2019/12/14/ 17:20:16 * 上傳文件到七牛雲 */
public class UploadFileQiniu implements UploadFile {

    private UploadProperties.Qiniu properties;

    //構造一個帶指定Region對象的配置類
    private Configuration cfg = new Configuration(Region.region2());

    private UploadManager uploadManager= new UploadManager(cfg);

    public UploadFileQiniu(UploadProperties.Qiniu properties) {
        this.properties = properties;
    }

    /** * @author: Johnson */
    @Override
    public String uploadFile(MultipartFile file) {
        Auth auth = Auth.create(properties.getAccessKey(), properties.getSecretKey());
        String token = auth.uploadToken(properties.getBucket());
        try {
            String originalFilename = file.getOriginalFilename();
            // 文件後綴
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String fileKey = UUID.randomUUID().toString() + suffix;
            Response response = uploadManager.put(file.getInputStream(), fileKey, token, null, null);
            return properties.getDomain() + fileKey;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "error";
    }
}
複製代碼

Region配置,這裏表明空間的存取區域,由於個人存儲空間的區域爲華南。因此爲Region.region2(),查看本身的存儲區域可在空間概覽的最下方查看到,這裏就不截圖了,圖片佔位太大。
Region對應的設置: this

image.png

好了,準備工做已完成,如今就到調用了,調用類以下:spa

@RestController
@RequestMapping("/upload")
public class UploadFileController {
    @Autowired
    UploadProperties uploadProperties;

    @PostMapping("/img")
    public String uploadFileYun(MultipartFile file) {
        // 上傳到七牛雲
        UploadFile uploadFile = new UploadFileQiniu(uploadProperties.getQiniu());
        return uploadFile.uploadFile(file);
    }
}
複製代碼

是否是很簡單呢?屁啊!簡單個毛線,其實這個我是已經簡化了,實際上在個人項目的結構是比這個複雜的。


總結

一:個人類名都是以Upload開頭的,類名已經寫死了只有上傳功能,就限制了這個類的可擴展性了,假如添加文件刪除功能,就不該該添加到這個類中。如今已經在重構文件操做(非文件上傳了)的功能模塊了。

二:一開始我以爲文件上傳功能可能使用的比較少,因此使用到的時候纔去實例化文件上傳類,可是這須要根據開發場景來決定,由於個人項目是一個博客後臺管理系統,會常常上傳圖片,因此上傳文件類能夠注入到Spring容器中,這樣也能夠減小實例化的開銷(雖然很小)。注入的話就是用@Component類註解。

三:配置文件我爲何會想到使用內部類來分割配置項呢?其實你們在編寫一些相似功能的時候,均可以去參照一下別人的源碼,固然,這裏指的是大神的源碼。由於我在寫配置項的時候就想看看大神的配置項是怎麼寫的,就點進了rabbitmq的配置項。因此啊,看到了大神的代碼是真的有長進的。

若是你須要查看更詳細的官方文檔,請點擊下方連接:

developer.qiniu.com/kodo/sdk/12…


最後:感謝你們的閱讀,Thanks♪(・ω・)ノ

我的博客網址: colablog.cn/

若是個人文章幫助到您,能夠關注個人微信公衆號,第一時間分享文章給您

微信公衆號
相關文章
相關標籤/搜索