[java] 멀티 파트 파일을 파일로 변환하는 방법?

아무도 멀티 파트 파일 (org.springframework.web.multipart.MultipartFile)을 파일 (java.io.File)로 변환하는 가장 좋은 방법이 무엇인지 말해 줄 수 있습니까?

내 봄 mvc 웹 프로젝트에서 나는 Multipart 파일로 업로드 된 파일을 얻고 있습니다. 파일 (io)로 변환해야 하므로이 이미지 저장 서비스 ( Cloudinary )를 호출 할 수 있습니다 .

너무 많은 검색을했지만 실패했습니다. 좋은 표준 방법을 아는 사람이 있으면 알려주세요. Thnx



답변

메소드 MultipartFile를 사용하여 의 내용을 가져올 수 있으며 다음 을 사용 getBytes하여 파일에 쓸 수 있습니다 Files.newOutputStream().

public void write(MultipartFile file, Path dir) {
    Path filepath = Paths.get(dir.toString(), file.getOriginalFilename());

    try (OutputStream os = Files.newOutputStream(filepath)) {
        os.write(file.getBytes());
    }
}

transferTo 메서드를 사용할 수도 있습니다 .

public void multipartFileToFile(
    MultipartFile multipart,
    Path dir
) throws IOException {
    Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename());
    multipart.transferTo(filepath);
}


답변

@PetrosTsialiamanis post에 대한 작은 수정,
new File( multipart.getOriginalFilename())이것은 언젠가 사용자에 대한 쓰기 권한 문제에 직면하게 될 서버 위치에 파일을 생성합니다. 작업을 수행하는 모든 사용자에게 항상 쓰기 권한을 부여 할 수있는 것은 아닙니다.
System.getProperty("java.io.tmpdir")파일이 제대로 생성 될 임시 디렉토리를 생성합니다. 이렇게하면 파일이 생성되는 임시 폴더를 만들고 나중에 파일 또는 임시 폴더를 삭제할 수 있습니다.

public  static File multipartToFile(MultipartFile multipart, String fileName) throws IllegalStateException, IOException {
    File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+fileName);
    multipart.transferTo(convFile);
    return convFile;
}

이 방법을 일반적인 유틸리티에 넣고 예를 들어처럼 사용하십시오. Utility.multipartToFile(...)


답변

받아 들여지는 대답은 정확하지만 이미지를 cloudinary에 업로드하려는 경우 더 좋은 방법이 있습니다.

Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());

multipartFile은 org.springframework.web.multipart.MultipartFile 입니다.


답변

Apache Commons IO 라이브러리 및 FileUtils 클래스를 사용할 수도 있습니다 . maven을 사용하는 경우 위의 종속성을 사용하여로드 할 수 있습니다.

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

MultipartFile의 소스는 디스크에 저장됩니다.

File file = new File(directory, filename);

// Create the file using the touch method of the FileUtils class.
// FileUtils.touch(file);

// Write bytes from the multipart file to disk.
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());


답변

MultipartFile.transferTo (File)은 좋지만 결국 임시 파일을 정리하는 것을 잊지 마십시오.

// ask JVM to ask operating system to create temp file
File tempFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_POSTFIX);

// ask JVM to delete it upon JVM exit if you forgot / can't delete due exception
tempFile.deleteOnExit();

// transfer MultipartFile to File
multipartFile.transferTo(tempFile);

// do business logic here
result = businessLogic(tempFile);

// tidy up
tempFile.delete();

아래에서 JVM 종료시 실행되는 File.deleteOnExit ()에 대한 Razzlero의 주석 (극히 드물지만) 세부 정보를 확인하십시오.


답변

  private File convertMultiPartToFile(MultipartFile file ) throws IOException
    {
        File convFile = new File( file.getOriginalFilename() );
        FileOutputStream fos = new FileOutputStream( convFile );
        fos.write( file.getBytes() );
        fos.close();
        return convFile;
    }


답변

당신은 인터페이스의 클래스가있는 경우 캐스팅에 의해 봄에 임시 파일에 액세스 할 수 MultipartFile있습니다 CommonsMultipartFile.

public File getTempFile(MultipartFile multipartFile)
{
    CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile;
    FileItem fileItem = commonsMultipartFile.getFileItem();
    DiskFileItem diskFileItem = (DiskFileItem) fileItem;
    String absPath = diskFileItem.getStoreLocation().getAbsolutePath();
    File file = new File(absPath);

    //trick to implicitly save on disk small files (<10240 bytes by default)
    if (!file.exists()) {
        file.createNewFile();
        multipartFile.transferTo(file);
    }

    return file;
}

10240 바이트 미만의 파일로 트릭을 제거하려면 클래스 maxInMemorySize에서 속성을 0으로 설정할 수 있습니다 @Configuration @EnableWebMvc. 그 후에 업로드 된 모든 파일은 디스크에 저장됩니다.

@Bean(name = "multipartResolver")
    public CommonsMultipartResolver createMultipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        resolver.setMaxInMemorySize(0);
        return resolver;
    }