Как определить каталог temp для загрузки файлов в Spring Boot?

Я использую 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.

Ответ 1

в springboot 1.4.1.RELEASE

spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
spring.http.multipart.enabled=true
spring.http.multipart.location= ..

будет нормально.

Ответ 2

Поскольку вы используете Spring Boot, проще использовать MultipartProperties в вашем файле application.properties.

Из примера документации:

# MULTIPART (MultipartProperties)
multipart.enabled=true
multipart.file-size-threshold=0 # Threshold after which files will be written to disk.
multipart.location= # Intermediate location of uploaded files.
multipart.max-file-size=1Mb # Max file size.
multipart.max-request-size=10Mb # Max request size.

Также вы можете прочитать подробное описание из MultipartProperties.

Чтобы настроить вашу систему tmpdir, вы можете установить:

multipart.location=${java.io.tmpdir}

Ответ 3

Если кто-то все еще ищет программную конфигурацию:

@Configuration
public class ServletConfig {

  @Bean
  public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
    final ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
    final String location = System.getProperty("java.io.tmpdir");
    final long maxFileSize = 128*1024;
    final long maxRequestSize = 128*1024;
    final MultipartConfigElement multipartConfig  = new MultipartConfigElement(location, maxFileSize, maxRequestSize, 0);
    registration.setMultipartConfig(multipartConfig);
    return registration;
  }

}