2014-01-13 8 views
7

Ich habe eine Java Spring MVC-Webanwendung. Vom Client über AngularJS lade ich eine Datei hoch und poste sie als Webservice auf dem Controller.Konvertieren von MultipartFile in java.io.File ohne Kopieren auf lokalen Computer

In meinem Controller bin ich es als MultipartFile gettinfg und ich kann es auf lokale Maschine kopieren.

Aber ich möchte die Datei auf Amazone S3 Eimer hochladen. Also muss ich es in java.io.File konvertieren. Was ich gerade mache, ist, dass ich es auf den lokalen Computer kopiere und dann mit jets3t auf S3 hochlade.

Hier ist meine Art und Weise in der Steuerung der Umwandlung

MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request; 

Iterator<String> itr=mRequest.getFileNames(); 
     while(itr.hasNext()){ 
      MultipartFile mFile=mRequest.getFile(itr.next()); 
      String fileName=mFile.getOriginalFilename(); 

      fileLoc="/home/mydocs/my-uploads/"+date+"_"+fileName; //date is String form of current date. 

Dann verwende ich FIleCopyUtils spring

File newFile = new File(fileLoc); 

        // if the directory does not exist, create it 
        if (!newFile.getParentFile().exists()) { 
        newFile.getParentFile().mkdirs(); 
        } 
       FileCopyUtils.copy(mFile.getBytes(), newFile); 

So wird es eine neue Datei in dem lokalen Rechner erstellen. Die Datei, die ich in S3

S3Object fileObject = new S3Object(newFile); 

s3Service.putObject("myBucket", fileObject); 

uplaoding Erstelle Datei in meinem lokalen System. Ich möchte nicht erstellen.

Ohne eine Datei im lokalen System zu schaffen, wie ein MultipartFIle-java.io.File konvertieren?

Antwort

6

MultipartFile ist standardmäßig bereits auf Ihrem Server als Datei gespeichert, wenn der Benutzer sie hochgeladen hat. Von diesem Punkt aus können Sie mit dieser Datei alles machen, was Sie wollen. Es gibt eine Methode, die diese temporäre Datei an ein beliebiges Ziel verschiebt. http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartFile.html#transferTo(java.io.File)

Aber MultipartFile ist nur API, können Sie andere MultipartResolver http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartResolver.html

implementieren Diese API Eingangsstrom akzeptiert und Sie können alles, was Sie wollen mit ihm tun. Die Standardimplementierung (normalerweise Commons-Multipart) speichert sie als Datei in Temp-Verzeichnis.

Aber andere Problem bleibt hier - wenn S3 API akzeptiert eine Datei als Parameter - Sie können nichts damit tun - Sie brauchen eine echte Datei. Wenn Sie überhaupt keine Dateien erstellen möchten, erstellen Sie Ihre eigene S3-API.

+0

Das einzige Problem ist das Erstellen der Datei im lokalen Rechner. Was ich jetzt mache ist, nachdem ich in Amazon hochgeladen habe, lösche ich von meinem lokalen Rechner. –

+1

Was inspiriert dieses Problem? S3 Java-API? Oder was ? Können Sie einen Eingabestream an S3 senden? – Boris

+0

Dies ist in Bezug auf die S3-API, die nur Dateiparameter akzeptiert, falsch, sie akzeptiert auch InputStream –

5

Die Frage ist bereits mehr als ein Jahr alt, also bin ich mir nicht sicher, ob der jets35 Link, der vom OP bereitgestellt wurde, zu dieser Zeit das folgende Snippet enthielt.

Wenn Ihre Daten ist kein File oder String Sie jede Eingangsstrom als Datenquelle verwenden können, aber manuelle Konfiguration des Content-Length einstellen müssen.

// Create an object containing a greeting string as input stream data. 
String greeting = "Hello World!"; 

S3Object helloWorldObject = new S3Object("HelloWorld2.txt"); 

ByteArrayInputStream greetingIS = new ByteArrayInputStream(greeting.getBytes()); 

helloWorldObject.setDataInputStream(greetingIS); 
helloWorldObject.setContentLength(
    greeting.getBytes(Constants.DEFAULT_ENCODING).length); 
helloWorldObject.setContentType("text/plain"); 

s3Service.putObject(testBucket, helloWorldObject); 

Es stellt sich heraus, Sie müssen nicht zuerst eine lokale Datei erstellen.Wie @Boris vorschlägt, können Sie die S3Object mit den Data Input Stream, Content Type und Content Length einspeisen, die Sie von MultipartFile.getInputStream(), MultipartFile.getContentType() bzw. MultipartFile.getSize() erhalten.