Я использую Spring Boot и должен позволить пользователям загружать файлы для обработки. Прямо сейчас, файл загружает в /home/username/ git/myproject, который невелик.
Как сделать Spring поместить эти загрузки файлов во временный каталог, который будет периодически очищаться при перезагрузке приложения (или каким-либо другим способом)?
Вот что я пробовал... но это не работает. Файл по-прежнему сохраняется в моем рабочем каталоге.
public class Application implements CommandLineRunner {
/*
* This doesn't seem to work.
*/
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("128KB");
factory.setMaxRequestSize("128KB");
factory.setLocation(System.getProperty("java.io.tmpdir"));
return factory.createMultipartConfig();
}
/* other stuff, main(), etc */
}
PS Я просто запускаю свое приложение, выполняя приложение и используя встроенный Tomcat.
UPDATE:
Хорошо, я разобрался. Я конвертировал входящий MultipartFile в обычный файл следующим образом:
private File convertMultipartFileToFile(MultipartFile file) throws IOException
{
File convFile = new File(file.getOriginalFilename());
convFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
Вместо этого я должен был создать новый файл в назначенном временном каталоге, например:
private File convertMultipartFileToFile(MultipartFile file) throws IOException
{
File convFile = File.createTempFile("temp", ".xlsx"); // choose your own extension I guess? Filename accessible with convFile.getAbsolutePath()
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
Теперь вы можете спросить: "Ну а как насчет настройки" multipart.location "файла application.properties?" Этот параметр, очевидный в ретроспективе, управляет только тем, где идет эфемерный многостраничный файл. Если вы смотрите этот каталог с script, вы увидите, что файл "upload_.tmp" появится ненадолго, а затем исчезнет. "multipart.location" не имеет ничего общего с постоянными файловыми объектами, которые вы могли бы создать.
(Обратите внимание, что вы можете использовать фрагмент кода MultipartBean сверху, а не application.properties, но я не пробовал его и зачем вам нужно?)
Чтобы изменить значение вашей текущей папки temp, вы можете использовать аргумент VM -Djava.io.tmp =/path/to/dir для указания того, что вы хотите, прежде чем запускать приложение загрузки Spring.