Spring MVC сохраняет загруженный файл MultipartFile в определенную папку

Я хочу сохранить загруженные изображения в определенную папку в приложении Spring 3 MVC, развернутом на Tomcat

Моя проблема в том, что я не могу сохранить загруженные файлы изображений на хост, на котором установлено приложение работает.

Вот что я пробовал:

  private void saveFile (MultipartFile multipartFile, int id) выдает исключение {String destination = "/ images/"+ id +"/"+ multipartFile.getOriginalFilename ();  Файл файл = новый файл (место назначения);  multipartFile.transferTo (file);}  

Результат: FileNotFoundException — Да, конечно, я действительно хочу создать этот файл!?!

Я пробовал использовать context.getRealPath или getResources ("destination") , но безуспешно.

Как я могу создать новый файл в определенной папке моего приложения с содержимым моего составного файла?


36

Этот код обязательно вам поможет.

  String filePath = request.getServletContext (). getRealPath ("/");  multipartFile.transferTo (новый файл (filePath));  

Поделиться
отредактировал 10 окт. в 12:19
vault
3,1233333 серебряных значка 4343 бронзовые значки
ответил 12 дек. ’13 в 16: 19
  • но без использования запроса сервлета http, как мы можем получить путь ..? — Джиджеш Кумар, 23 апр. ’15 в 13:20
  • Есть много способов: вы можете использовать запрос или сеанс, чтобы получить реальный путь. Спасибо, Рави. M — Phuong 5 окт. ’15 в 16:24
добавить комментарий |

Этот код вам обязательно поможет.

  String filePath = request.getServletContext (  ) .getRealPath ("/");  multipartFile.transferTo (новый файл (filePath));  

16

Давайте создадим каталог uploads в webapp и сохраним файлы в webapp/uploads :

   @RestControllerpublic class GreetingController {закрытый конечный статический журнал Logger = LoggerFactory.getLogger (GreetingController.class);  @Autowired частный запрос HttpServletRequest;  @RequestMapping (value = "/uploadfile", method = RequestMethod.POST) public @ResponseBody ResponseEntity handleFileUpload (@RequestParam ("file") MultipartFile file) {if (! File. isEmpty ()) {попробуйте {String uploadsDir = "/uploads/";  Строка realPathtoUploads = request.getServletContext (). GetRealPath (uploadsDir);  если (! новый файл (realPathtoUploads) .exists ()) {новый файл (realPathtoUploads) .mkdir ();  } log.info ("realPathtoUploads = {}", realPathtoUploads);  Строка orgName = file.getOriginalFilename ();  Строка filePath = realPathtoUploads + orgName;  Файл dest = новый файл (filePath);  file.transferTo (dest);  

код
String realPathtoUploads = request.getServletContext (). getRealPath (uploadsDir);

возвращает следующий путь, если я запускаю приложение из Idea IDE
C: Users Iuliia IdeaProjects ENumbersBackend src main webapp uploads

и следующий путь, если я создам .war и запускаю его под Tomcat:
D: Programs_Files apache-tomcat-8.0.27 webapps enumbservice-0.2.0 uploads

Моя структура проекта:

Поделиться
отредактировал 8 декабря 2015 в 18 : 00
ответил 08 декабря 2015, 17:47
  • 1
    Последняя строка кода ‘file.transferTo (dest);’ дает мне исключение ввода-вывода и сообщение об ошибке: «Система не может найти указанный путь». Есть идеи, почему это происходит? — MR AND 17 апр. ’17 в 20:20
  • 1
    @AND, вы уверены, что путь существует в вашей файловой системе? Сначала вам нужно создать каталоги (вручную или программно). — Юлия Ашомок 18 апр. ’17 в 7:22
  • 1
    Это было очень полезно. Хотя это фактически тот же ответ, что и у Рави, это более подробный ответ. Этот ответ все еще действителен в Spring Boot 1.5.10 — Стефан, 26 марта 2018 г., 20:39
добавить комментарий |

Давайте создадим каталог uploads в webapp и сохраним файлы в webapp/uploads :

  @RestControllerpublic class GreetingController {закрытый конечный статический журнал Logger = LoggerFactory.getLogger (GreetingController.class);  @Autowired частный запрос HttpServletRequest;  @RequestMapping (value = "/uploadfile", method = RequestMethod.POST) public @ResponseBody ResponseEntity handleFileUpload (@RequestParam ("file") MultipartFile file) {if (! File.isEmpty ()) {попробуйте {String uploadsDir = "/ загружает/";  Строка realPathtoUploads = request.getServletContext (). GetRealPath (uploadsDir);  если (! новый файл (realPathtoUploads). существует ()) {новый файл (realPathtoUploads) .mkdir ();  } log.info ("realPathtoUploads = {}", realPathtoUploads);  Строка orgName = file.getOriginalFilename ();  Строка filePath = realPathtoUploads + orgName;  Файл dest = новый файл (filePath);  file.transferTo (dest);  

код
String realPathtoUploads = request.getServletContext (). getRealPath (uploadsDir);

возвращает следующий путь, если я запускаю приложение из Idea IDE
C: Users Iuliia IdeaProjects ENumbersBackend src main webapp uploads

и следующий путь, если я создам .war и запустил его под Tomcat:
D: Programs_Files apache-tomcat-8.0.27 webapps enumbservice-0.2.0 uploads

Моя структура проекта:


4

Вы можете получить inputSream из multipartfile и скопировать его в любой каталог.

  public String write (MultipartFile file, String fileType) выдает исключение IOException {String date = LocalDateTime.  now (). format (DateTimeFormatter.ofPattern ("yyMMddHHmmss-"));  Строка fileName = date + file.getOriginalFilename (); //Путь к папке здесь/sismed/temp/exames String folderPath = SismedConstants.TEMP_DIR + fileType;  Строка filePath = folderPath + "/" + fileName; //Копирует multipartfile inputStream Spring в/sismed/temp/exames (абсолютный путь) Files.copy (file.getInputStream (), Paths.get (filePath), StandardCopyOption.REPLACE_EXISTING);  return filePath;}  

Это работает как для Linux, так и для Windows.

Поделиться
ответил 5 февраля ’19 в 18:37
  • 1
    хороший пример . просто заменил «/» на File.separator — Симоне Селия 26 авг., 20:31
добавить комментарий |

Вы можете получить inputSream из multipartfile и скопировать его в любой каталог по вашему желанию.

  public String write (файл MultipartFile, String fileType) выдает исключение IOException {String date = LocalDateTime.now (). format (DateTimeFormatter.ofPattern ("yyMMddHHmmss-"));  Строка fileName = date + file.getOriginalFilename (); //Путь к папке здесь/sismed/temp/exames String folderPath = SismedConstants.TEMP_DIR + fileType;  Строка filePath = folderPath + "/" + fileName; //Копирует multipartfile inputStream Spring в/sismed/temp/exames (абсолютный путь) Files.copy (file.getInputStream (), Paths.get (filePath), StandardCopyOption. REPLACE_EXISTING);  return filePath;}  

Это работает как для Linux, так и для Windows.


1

Я видел пример Spring 3 с использованием конфигурации xml (обратите внимание, это не работает для Spring 4.2. *): http://www.devmanuals.com/ учебники/java/spring/spring3/mvc/spring3-mvc-upload-file.html`

         C:/test111     

Поделиться
26 янв. : 20
добавить комментарий |

Я видел пример Spring 3 с использованием конфигурации xml (обратите внимание, это не работает для Spring 4.2. *): http://www. devmanuals.com/tutorials/java/spring/spring3/mvc/spring3-mvc-upload-file.html`

         C:/test111     


0
  String ApplicationPath = ContextLoader.getCurrentWebApplicationContext (). getServletContext (). getRealPath ("");  

Вот как получить реальный путь к приложению в Spring (без использования ответа, s ession …)

Поделиться
ответил 13 дек. : 20
  • 2
    вы не должны использовать getRealPath () для сохранения файлов .. см. этот ответ — cosyconemotel 29 мая ’17 в 3:28
добавить комментарий |

  String ApplicationPath = ContextLoader.getCurrentWebApplicationContext (). getServletContext (). getRealPath ("");  

Вот как получить реальный путь к приложению в Spring (без использования ответа, сеанса …)


0

В ubuntu у меня работало следующее:

  String filePath = request.getServletContext (). getRealPath  ("/"); Файл f1 = новый файл (filePath + "/" + multipartFile.getOriginalFilename ()); multipartFile.transferTo (f1);  

Поделиться iv>
отредактировано 7 июня ’18 в 16:14
Alan Birtles
21.2k44 золотых знака2121 серебряных знака4343 бронзовых знака
ответил 7 июня ’18 в 14:19
добавить комментарий |

В ubuntu у меня работало следующее:

  String filePath = request.getServletContext  () .getRealPath ("/"); Файл f1 = новый файл (filePath + "/" + multipartFile.getOriginalFilename ()); multipartFile.transferTo (f1);  

Оцените статью
Botgadget.ru
Добавить комментарий