SpringBoot реализует загрузку файлов в локальное хранилище и предоставляет услуги доступа по HTTP.

Spring Boot

Автор планирует представить распределенную файловую систему для хранения картинок, word, excel, pdf и других файлов приложения. Прежде чем начать знакомство с распределенной файловой системой, позвольте мне рассказать об использовании локального хранилища для хранения файловых ресурсов. Основной процесс реализации обоих одинаковый:

  • Загрузите файл, сохраните файл (этот раздел является локальным диском)
  • Верните путь службы HTTP-доступа к файлу во внешний интерфейс и отобразите эффект после загрузки.

1. Обзор

Целью сервера для получения загрузок является предоставление услуг доступа к файлам, поэтому для SpringBoot, какие каталоги статических ресурсов могут предоставлять доступ к файлам?

  • classpath:/META-INF/resources/ ,
  • classpath:/static/ ,
  • classpath:/public/ ,
  • classpath:/resources/

Это то, что мы представили вам ранее Отсюда мы можем видеть, что все статические ресурсы здесь находятся в пути к классам. Тогда возникает проблема:

  • Файловые ресурсы приложения нельзя хранить отдельно от кода проекта (вы когда-нибудь загружали код на github с прикрепленными данными файла проекта?)
  • Сложно упаковать проект, когда загружается все больше и больше файлов, упакованный jar проекта становится все больше и больше.
  • Код и данные файла нельзя хранить отдельно, а это означает, что резервное копирование данных файла усложнится.

Во-вторых, пользовательская конфигурация каталога загрузки файлов

Как решить вышеуказанные проблемы?Не забывайте, что Spring Boot предоставляет намиспользоватьspring.resources.static-locationsНастройте расположение пользовательских статических файлов.

web:
  upload-path: D:/data/

spring:
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
  • настроитьweb.upload-pathСохраните корневой путь для пути к статическому ресурсу отдельно от кода проекта, а именно: загрузка файла
  • настроитьspring.resources.static-locations, в дополнение к пути к статическому ресурсу Spring Boot по умолчанию, а также file:${web.upload-path}, указывающему на путь загрузки внешнего файлового ресурса. Статические ресурсы на этом пути могут напрямую предоставлять службы доступа HTTP внешнему миру.

3. Реализация контроллера загрузки файлов

Подробности смотрите в комментариях к коду.

@RestController
public class FileUploadController {

    //绑定文件上传路径到uploadPath
    @Value("${web.upload-path}")
    private String uploadPath;
 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
 
    @PostMapping("/upload")
    public String upload(MultipartFile uploadFile,
                         HttpServletRequest request) {

        // 在 uploadPath 文件夹中通过日期对上传的文件归类保存
        // 比如:/2019/06/06/cf13891e-4b95-4000-81eb-b6d70ae44930.png
        String format = sdf.format(new Date());
        File folder = new File(uploadPath + format);
        if (!folder.isDirectory()) {
            folder.mkdirs();
        }
 
        // 对上传的文件重命名,避免文件重名
        String oldName = uploadFile.getOriginalFilename();
        String newName = UUID.randomUUID().toString()
                + oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            // 文件保存
            uploadFile.transferTo(new File(folder, newName));
 
            // 返回上传文件的访问路径
            String filePath = request.getScheme() + "://" + request.getServerName()
                    + ":" + request.getServerPort()  + format + newName;
            return filePath;
        } catch (IOException e) {
            throw new CustomException(CustomExceptionType.SYSTEM_ERROR);
        }

    }
}

В-четвертых, напишите смоделированную страницу загрузки файлов для тестирования.

Поместите файл upload.html в каталог classpath:public, чтобы обеспечить внешний доступ.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="请选择上传文件">
    <input type="submit" value="保存">
</form>
</body>
</html>

Откройте тест, нажмите «Выбрать файл», затем сохраните

Файл сохраняется на сервереweb.upload-pathв указанном каталоге ресурсов

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

При использовании этого пути доступа HTTP эффект доступа на стороне браузера следующий. Это доказывает, что наш файл был успешно загружен на сервер, и если нам понадобится доступ к изображению в будущем, мы можем использовать этот URL-адрес HTTP.

Добро пожаловать, чтобы обратить внимание на мой блог, в нем много прекрасных коллекций

  • Эта статья воспроизводится с указанием источника (должна быть ссылка, а не только текст):Блог Адетокунбо.

Если вы считаете это полезным, пожалуйста, поставьте лайк и поделитесь! Ваша поддержка - моя неиссякаемая творческая мотивация!. Кроме того, автор недавно выпустил следующий прекрасный контент, с нетерпением жду вашего внимания.