SpringBoot загружает файлы в облако Qiniu

Java

Готов к работе

maven

pom.xml добавляет зависимость Qiniuyun от SDK

        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.27</version>
        </dependency>

элемент конфигурации

Необходимые конфигурации для загрузки в облако Qiniu: accessKey, secretKey, Bucket. AccessKey и secretKey можно посмотреть на этом сайте

portal.qiniu.com/user/key

Bucket — это имя вашего пространства для хранения, как показано ниже:

image.png


выполнить

конфигурация application.yml

upload:
  qiniu:
    domain: 填你的域名
    access-key: 你的accesskey
    secret-key: 你的secretKey
    bucket: 你的存储空间名,我这里为colablog

Вы можете видеть, что в моей конфигурации загрузки облака Qiniu естьdomainЭта конфигурация, эта конфигурация является доменным именем хранилища Qiniuyun buket, вУправление содержаниемВ основном он используется для возврата пути доступа к файлу после успешной загрузки файла.

image.png
Но это доменное имя ограничено 30 днями, так что вам лучше привязать новое доменное имя.

Загрузить класс конфигурации

Использование SpringBoot@ConfigurationPropertiesи@ComponentАннотировать класс конфигурации, реализующий загрузкуUploadProperties, Поскольку конфигурация загрузки может иметь локальную загрузку, загрузку в облако или другие загрузки, я оставил точку расширения для этого класса конфигурации. Поскольку он вдохновлен классом конфигурации rabbitmq, и загружено не так много конфигураций, внутренний класс используется для разделения этого класса конфигурации. Класс конфигурации загрузки выглядит следующим образом:

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;
        }
    }
}

Интерфейс загрузки в облако Qiniu и класс

Интерфейс загрузки выглядит следующим образом:

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

загрузить класс

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Соответствующие настройки:

image.png

Что ж, приготовления завершены, теперь пора звонить, вызывающий класс выглядит следующим образом:

@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Аннотации классов.

Три: Профили, почему я думаю, что использование внутреннего класса элемента конфигурации, чтобы разделить его? На самом деле, мы пишем некоторые подобные функции, когда другие люди могут пойти посмотреть ссылку на исходный код, конечно, здесь мы ссылаемся на источник великого Бога. Потому что я пишу CI, когда CI хотел посмотреть, насколько большой Бог прописан в элементах конфигурации с точки зрения rabbitmq. Итак, ах, я вижу код большого Бога на самом деле в отсутствии прогресса.

Если вам нужно просмотреть более подробную официальную документацию, пожалуйста, нажмите на ссылку ниже:

developer.qiu.com/KO do/fast/12…


Наконец: Спасибо за чтение, спасибо♪(・ω・)ノ

Адрес личного блога:colablog.cn/

Если моя статья поможет вам, вы можете подписаться на мою публичную учетную запись WeChat и поделиться статьей с вами как можно скорее.

微信公众号