Зберігайте його в будь-якому місці у доступному місці, за винятком папки проекту IDE, яка називається папкою розгортання сервера, з причин, зазначених у відповіді на завантажене зображення, доступному лише після оновлення сторінки :
Зміни в папці проекту IDE не одразу відображаються у робочій папці сервера. В IDE є якесь фонове завдання, яке дбає про те, щоб робоча папка сервера синхронізувалася з останніми оновленнями (це в термінах IDE називається "публікація"). Це основна причина проблеми, яку ви бачите.
У реальному коді світу є обставини, коли зберігання завантажених файлів у папці розгортання webapp взагалі не працюватиме. Деякі сервери (за замовчуванням чи за конфігурацією) не розгортають розгорнутий файл WAR в файлову систему локального диска, а натомість повністю в пам'яті. Ви не можете створити нові файли в пам'яті без редагування розгорнутого файлу WAR та його повторної розгортання.
Навіть коли сервер розгортає розгорнутий файл WAR у файлову систему локального диска, всі новостворені файли втрачаються за допомогою повторної розробки або навіть простого перезавантаження, просто тому, що ці нові файли не є частиною вихідного файлу WAR.
Мені і комусь насправді не важливо, де саме в локальній дисковій файловій системі він буде збережений, доки ви ніколи не використовуєте getRealPath()
метод . Використання цього методу в будь-якому випадку насторожує.
Шлях до місця зберігання в свою чергу може бути визначений багатьма способами. Ви повинні зробити це все самостійно . Можливо, саме тут і виникає ваша плутанина, тому що ви якось очікували, що сервер це зробить автоматично. Зверніть увагу, що @MultipartConfig(location)
це не так вказати кінцевий пункт призначення завантаження, але місце тимчасового зберігання розміру разі файлу перевищує поріг зберігання пам'яті.
Отже, шлях до остаточного місця зберігання можна визначити одним із наступних способів:
Жорсткий код:
File uploads = new File("/path/to/uploads");
Змінна середовище через SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Аргумент VM під час запуску сервера через -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
запис файлу як upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
з назвою upload.location
та значенням/path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Якщо є, використовуйте надане сервером розташування, наприклад у JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
У будь-якому випадку ви можете легко посилатися та зберігати файл таким чином:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Або, коли ви хочете автогенерувати унікальне ім’я файлу, щоб запобігти перезапису користувачів існуючі файли з збігом випадково однакових назв:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Як отримати part
в JSP / Servlet відповідь у розділі Як завантажувати файли на сервер за допомогою JSP / Servlet? і як отриматиpart
в JSF відповідь у розділі Як завантажити файл за допомогою JSF 2.2 <h: inputFile>? Де збережений файл?
Примітка: не використовуйте, Part#write()
оскільки він інтерпретує шлях відносно місця тимчасового зберігання, визначеного в @MultipartConfig(location)
.
Дивитися також: