developer tip

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

optionbox 2020. 10. 18. 09:20
반응형

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


누구나 멀티 파트 파일 (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);
}

허용되는 대답은 정확하지만 이미지를 cloudinary에 업로드하려는 경우 더 나은 방법이 있습니다.

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

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


@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(...)


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의 주석 (극히 드물지만) 세부 정보를 확인하십시오.


Alex78191의 답변이 저에게 효과적이었습니다.

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 바이트보다 큰 파일을 업로드하려면 multipartResolver의 maxInMemorySize를 1MB로 변경하십시오.

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- setting maximum upload size t 20MB -->
<property name="maxUploadSize" value="20971520" />
<!-- max size of file in memory (in bytes) -->
<property name="maxInMemorySize" value="1048576" />
<!-- 1MB --> </bean>

당신은 인터페이스의 클래스가있는 경우 캐스팅에 의해 봄에 임시 파일에 액세스 할 수 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;
    }

MultipartFile.transferTo ()를 사용하지 않으려면. 다음과 같이 파일을 작성할 수 있습니다.

    val dir = File(filePackagePath)
    if (!dir.exists()) dir.mkdirs()

    val file = File("$filePackagePath${multipartFile.originalFilename}").apply {
        createNewFile()
    }

    FileOutputStream(file).use {
        it.write(multipartFile.bytes)
    }

  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;
    }

참고URL : https://stackoverflow.com/questions/24339990/how-to-convert-a-multipart-file-to-file

반응형