2013-05-20 25 views
19

Esiste un modo per convertire un oggetto File in MultiPartFile? In modo che io possa inviare quell'oggetto ai metodi che accettano gli oggetti dell'interfaccia MultiPartFile?Conversione di file in MultiPartFile

File myFile = new File("/path/to/the/file.txt") 

MultiPartFile ....? 

def (MultiPartFile file) { 
    def is = new BufferedInputStream(file.getInputStream()) 
    //do something interesting with the stream 
} 
+2

Dovresti essere in grado di scrivere la tua classe che implementa ['FileItem'] (http://commons.apache.org/proper/commons-fileupload/apidocs/org/apache/commons/fileupload/FileItem.html) ma questo richiede un vero 'File' da delegare a, quindi passa questa istanza' FileItem' al costruttore di ['CommonsMultipartFile'] (http://static.springsource.org/spring/docs/1.2.x/api/org /springframework/web/multipart/commons/CommonsMultipartFile.html) che implementa 'MultiPartFile' –

+0

Ho creato una classe che implementa FileItem ma non so come implementare tutti i metodi di tale interfaccia. Ho creato una variabile in questa classe che è 'File myFile'. Dovrei semplicemente implementare 'getinputStream()' e 'getOutputStream()'? – birdy

+0

in particolare, non so cosa intendi con questo "ma questo richiede un vero file da delegare a". Questo è quello che ho finora: https://gist.github.com/birdy101/5616009 – birdy

risposta

4
File file = new File("src/test/resources/validation.txt"); 
    DiskFileItem fileItem = new DiskFileItem("file", "text/plain", false, file.getName(), (int) file.length() , file.getParentFile()); 
    fileItem.getOutputStream(); 
    MultipartFile multipartFile = new CommonsMultipartFile(fileItem); 

è necessario il

fileItem.getOutputStream(); 

perché getterà NPE altrimenti.

+0

** fileItem.getOutputStream(); ** sguardi come la magia – gstackoverflow

+1

È una magia Java;) – despot

16

MockMultipartFile esiste per questo scopo. Come nel tuo snippet se il percorso del file è noto, il codice seguente funziona per me.

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import org.springframework.mock.web.MockMultipartFile; 

Path path = Paths.get("/path/to/the/file.txt"); 
String name = "file.txt"; 
String originalFileName = "file.txt"; 
String contentType = "text/plain"; 
byte[] content = null; 
try { 
    content = Files.readAllBytes(path); 
} catch (final IOException e) { 
} 
MultipartFile result = new MockMultipartFile(name, 
        originalFileName, contentType, content); 
+3

È possibile farlo senza salvare il file su disco? – Tisha

6
File file = new File("src/test/resources/input.txt"); 
    FileInputStream input = new FileInputStream(file); 
    MultipartFile multipartFile = new MockMultipartFile("file", 
      file.getName(), "text/plain", IOUtils.toByteArray(input)); 
1

Nel mio caso, il

fileItem.getOutputStream(); 

non funzionava. Così ho fatto io con IOUtils,

File file = new File("/path/to/file"); 
FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile()); 

try { 
    InputStream input = new FileInputStream(file); 
    OutputStream os = fileItem.getOutputStream(); 
    IOUtils.copy(input, os); 
} catch (IOException ex) { 
    // do something. 
} 

MultipartFile multipartFile = new CommonsMultipartFile(fileItem); 
+0

Grazie, questo era esattamente quello di cui avevo bisogno !! :) – gabowsky

3
MultipartFile multipartFile = new MockMultipartFile("test.xlsx", new FileInputStream(new File("/home/admin/test.xlsx"))); 

questo codice wooks bene per me.May essere che si può avere una prova.

Problemi correlati