2014-01-13 10 views
7

Java Spring MVC Webアプリケーションがあります。クライアントから、AngularJS経由でファイルをアップロードし、webserviceとしてControllerに投稿しています。ローカルマシンにコピーせずにMultipartFileをjava.io.Fileに変換する

私のコントローラでは、MultipartFileとして取得しています。ローカルマシンにコピーすることができます。

しかし、ファイルをにアップロードします。Amazone S3バケット。だから私はjava.io.Fileにそれを変換する必要があります。私がやっているのは、ローカルマシンにコピーしてからjets3tを使ってS3にアップロードしているところです。ここで

コントローラに

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. 

を変換する私の方法であるそれから私は、だから、それがローカルマシンに新しいファイルを作成しますSpringFramework

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

のFIleCopyUtilsを使用しています。そのファイルはS3で取得しようとしています

S3Object fileObject = new S3Object(newFile); 

s3Service.putObject("myBucket", fileObject); 

私のローカルシステムにファイルが作成されます。私は作成したくありません。

ローカルシステムのファイルを作成せずに、どのようにjava.io.FileのMultipartFIleを変換するには?

答えて

6

デフォルトでは、MultipartFileはユーザーがアップロードしたときにファイルとしてサーバーに保存されています。 その点から、このファイルで何でもできます。 一時ファイルを目的の場所に移動する方法があります。 http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartFile.html#transferTo(java.io.File)

しかしMultipartFileは単なるAPIである、あなたが他のMultipartResolver http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartResolver.html

を実装することができます。このAPIは、入力ストリームを受け入れ、あなたがそれで欲しいものを行うことができます。デフォルトの実装(通常はcommons-multipart)は、それをファイルとして一時ディレクトリに保存します。

しかし、他の問題はここにとどまっています.S3 APIがファイルをパラメータとして受け入れる場合は、これで何もできません。実際のファイルが必要です。ファイルの作成を避けたい場合は、S3 APIを作成してください。

+0

ローカルマシンにファイルを作成するだけで問題があります。私が今やっていることは、アマゾンでアップロードした後、ローカルマシンから削除しています。 –

+1

この問題の原因は何ですか? S3 Java-API?または何 ?あなたはS3に入力ストリームを送る能力を持っていますか? – Boris

+0

これは、S3 APIのファイルパラメータのみを受け入れる点では間違っており、InputStream –

5

質問はすでに1歳以上ですので、OPで提供されているjets35のリンクに当時の次のスニペットがあるかどうかはわかりません。

あなたのデータは、データソースとして任意の入力ストリームを使用することができますが、手動のContent-Lengthを設定する必要がありますFileStringされていない場合。

// 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); 

それはあなたが最初にローカルファイルを作成する必要はありませんが判明しました。@Borisは、S3ObjectData Input StreamContent TypeContent Lengthを入力できると示唆しているので、MultipartFile.getInputStream()MultipartFile.getContentType()MultipartFile.getSize()からそれぞれ得られます。

関連する問題