Автор планирует представить распределенную файловую систему для хранения картинок, 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.
Добро пожаловать, чтобы обратить внимание на мой блог, в нем много прекрасных коллекций
- Эта статья воспроизводится с указанием источника (должна быть ссылка, а не только текст):Блог Адетокунбо.
Если вы считаете это полезным, пожалуйста, поставьте лайк и поделитесь! Ваша поддержка - моя неиссякаемая творческая мотивация!. Кроме того, автор недавно выпустил следующий прекрасный контент, с нетерпением жду вашего внимания.