Общие требования: загрузка файлов для серверных проектов Java является очень распространенным требованием. Как правило, в официальных проектах мы используем стороннюю операционную систему Alibaba Cloud для загрузки файлов. Однако, если это просто в учебных целях, мы можем загружать их напрямую. в локальную папку на вашем компьютере.
Но если вы загрузите его в папку на своем компьютере, вы не сможете увидеть его на другом компьютере. После загрузки общих файлов нам нужно вернуть путь загрузки к файлу внешнего интерфейса, если это случайная папка. на компе, то фронтенд наверное недоступен.
Чтобы решить проблему внешнего доступа, мы можем загрузить файл в каталог статических ресурсов внутренней службы, чтобы внешний интерфейс мог напрямую получить к нему доступ через адрес и порт внутренней службы. плюс путь к ресурсу.
Мы можем получить путь к загруженному файлу с помощью метода ResourceUtils.getURL("classpath:").getPath(). Мы получаем абсолютный путь к скомпилированному каталогу target/classes. Файлы, загруженные внешним интерфейсом, могут быть. напрямую сохраняется здесь. Например, следующий каталог: target/classes/upload/logo.jpg, адрес загрузки, возвращаемый во внешний интерфейс, выглядит следующим образом: http://localhost:8080/upload/logo.jpg.
Приведенная выше идея решает проблему загрузки и выгрузки, но целевой каталог изменится и не будет отправлен в хранилище кода. Если мы очистим, а затем перекомпилируем или изменим компьютер для компиляции, ранее загруженные файлы исчезнут.
Что делать? Если вы внимательно подумаете, разве в нашем проекте нет каталога с именем resources, который используется для хранения статических ресурсов? Этот каталог обычно передается в хранилище кода для управления. Тогда нельзя ли отправлять файлы, которые мы загружаем каждый раз? на склад вместе? Постоянное хранение достигается.
Просто сделайте это и сохраните файл непосредственно в каталоге resources/upload. Как только серверная часть запустится и внешний интерфейс загрузит файл, файл действительно будет сохранен в каталоге resources/upload. Присмотревшись, я увидел, что это неправильно. Адрес внешнего интерфейса не имел доступа к только что загруженному файлу, поскольку в каталоге target/classes не было нового загруженного файла. После компиляции файлы в папке. Каталог ресурсов был синхронизирован с каталогом target/classes. Доступ действительно возможен, но мы не можем повторно щелкнуть мышью для компиляции и повторного запуска каждый раз, когда мы его загружаем.
Подводя итог, я объединю ресурсы и цель и сохраню файлы в этих двух каталогах одновременно. Можно ли будет добиться постоянного хранения и доступа в реальном времени?
Используйте System.getProperty("user.dir"), чтобы получить рабочий каталог проекта, а затем добавьте каталог структуры проекта, чтобы получить абсолютный путь к каталогу ресурсов; для рабочего каталога цели/классов используйте ResourceUtils.getURL( "classpath:").getPath() получает.
Обратите внимание: если последний загруженный каталог ресурсов обращается к 404, проверьте путь статического ресурса Spring.mvn в application.yml, правила фильтрации ресурсов в pom.xml и было ли перехвачено статическое сопоставление ресурсов addResourceHandler, настроенное в WebMvcConfiguration.
Наконец, интерфейсная часть передала файл File, но на самом деле нет возможности циклически сохранить файл в несколько каталогов. После успешного сохранения первой папки последующие сообщат об ошибке. файл на компьютере. Его можно сохранить только в одном каталоге. Если вы хотите сохранить его в другой каталог, просто скопируйте его самостоятельно. Мы сохраняем первый каталог напрямую, и вы можете напрямую скопировать второй. каталог, используя FileCopyUtils.copy, предоставленный Spring.
UploadFileUtil.java
packagecom.sky.utils;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.UUID;
importorg.springframework.util.FileCopyUtils;
importorg.springframework.util.ResourceUtils;
importorg.springframework.web.multipart.MultipartFile;
publicclassUploadFileUtil{
/**
* Получить путь сохранения документа
*
* @return File
* @throws FileNotFoundException
*/
staticList<File>getUploadDirectory()throwsFileNotFoundException{
// Приобретение среды разработки target/classes Каталог: После очистки и повторной установки он исчезнет.
File targetPath =newFile(ResourceUtils.getURL("classpath:").getPath());
// System.out.printf("Абсолютный путь запуска проекта:" + path.getAbsolutePath());
// выход xx/sky-parent/sky-server/target/classes
// производственная среда 不存существовать target/classes Оглавление
if(!targetPath.exists()){
// Будьте в курсе событий
targetPath =newFile("");
}
// среда разработки resources Оглавление: Можно сохранить навсегда.
String resourcesPath =System.getProperty("user.dir")+"/sky-server/src/main/resources";
// System.out.printf("resources Оглавление path:" + resourcesPath);
File path =newFile(resourcesPath);
File upload =newFile(path.getAbsolutePath(),"upload");
File uploadTarget =newFile(targetPath.getAbsolutePath(),"upload");
// Создать, если существования не существует
if(!upload.exists()){
upload.mkdirs();
}
if(!uploadTarget.exists()){
uploadTarget.mkdirs();
}
List<File> files =newArrayList<File>();
files.add(upload);
files.add(uploadTarget);
// System.out.printf("текущий Оглавление:" + files);
return files;
}
publicstaticStringupload(MultipartFile myFile,String dir)throwsIOException{
String filePath ="";
if(!myFile.isEmpty()){
try{
String filename = myFile.getOriginalFilename();
filename = UUID.randomUUID()+ filename.substring(filename.lastIndexOf("."));
// Причина, по которой он сохраняется в resources и target два Оглавление,С учетом разработки и тестированияи永久保存
// Сохранить только вresourcesОглавление Приходится каждый раз перезагружатькомпилировать Вниз,Мишень исчезнет после очистки и упаковки.
List<File> files =getUploadDirectory();
// Обратите внимание, что этот внутридокумент не может быть записан в цикле для нескольких Оглавлений одновременно.,Сохранил первый,Второй надо копировать
Файл curFile =newFile(files.get(0), имя файла);
мой Файл.transferTo(curFile);
FileCopyUtils.copy(curFile,newFile(files.get(1), имя файла));
//для (Файл f: файлы) {
//Файл curFile = новый файл(f, имя файла);
//myFile.transferTo(curFile);
//}
filePath = "http://localhost:8080/upload/"+ имя файла;
}catch(Исключение е){
е.printStackTrace();
}
}
вернуть путь к файлу;
}
}
application.yml
server:
port:8080
spring:
mvc:
static-path-pattern: /upload/**
WebMvcConfiguration
packagecom.sky.config;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
importjava.util.List;
/**
* Класс конфигурации, регистрация компонентов, связанных с веб-слоем.
*/
@Configuration
publicclassWebMvcConfigurationextendsWebMvcConfigurationSupport{
/**
* Установить статическое сопоставление ресурсов
* @param registry
*/
protectedvoidaddResourceHandlers(ResourceHandlerRegistry registry){
// Установите статическое сопоставление ресурсов загруженного документа, приложение внутрииз mvc внутри也要设置Вниз静态Оглавление
registry.addResourceHandler("/upload/**")
.addResourceLocations("classpath:/upload/","file:upload/");
}
}
Получите файл файла, загруженный внешним интерфейсом, используя форму в контроллере.
packagecom.sky.controller.common;
importcom.sky.result.Result;
importcom.sky.utils.UploadFileUtil;
importio.swagger.annotations.Api;
importio.swagger.annotations.ApiOperation;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.PostMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importorg.springframework.web.multipart.MultipartFile;
importjava.io.IOException;
/**
* общественный запрос
*/
@RestController
@RequestMapping("/common")
@Api(tags ="публичный")
@Slf4j
publicclassCommonController{
@PostMapping("/upload")
@ApiOperation("загрузитьдокумент") publicResultuploadFile(MultipartFile file)throwsIOException{
log.info("загрузитьдокумент:{}", file);
String fileUrl =UploadFileUtil.upload(file,"");
if(fileUrl ==null|| fileUrl ==""){
returnResult.error("Не удалось загрузить");
}
returnResult.success(fileUrl);
}
}