web-dev-qa-db-ja.com

ローカルマシンにコピーせずにMultipartFileをJava.io.Fileに変換する

Java Spring MVC Webアプリケーションがあります。クライアントからAngularJSを介して、ファイルをアップロードし、Webサービスとしてコントローラーに投稿しています。

私のコントローラーでは、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のFIleCopyUtilsを使用しています

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

そのため、ローカルマシンに新しいファイルが作成されます。私がS3で更新しているそのファイル

S3Object fileObject = new S3Object(newFile);

s3Service.putObject("myBucket", fileObject);

それは私のローカルシステムにファイルを作成します。作りたくない。

ローカルシステムでファイルを作成せずに、MultipartFIleJava.io.File

10
Shiju K Babu

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

ただし、MultipartFileは単なるAPIであり、他のMultipartResolverhttp://docs.spring.io/spring/docs/3.0)を実装できます。 x/api/org/springframework/web/multipart/MultipartResolver.html

このAPIは入力ストリームを受け入れ、それを使って何でもできます。デフォルトの実装(通常はcommons-multipart)は、それをファイルとしてtempdirに保存します。

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

8
Boris

質問はすでに1年以上前のものであるため、OPによって提供された jets35 リンクにその時点で次のスニペットがあったかどうかはわかりません。

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

_// 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が示唆しているように、_S3Object_に_Data Input Stream_、_Content Type_、および_Content Length_をフィードすると、 MultipartFile.getInputStream() から取得できます。 =、 MultipartFile.getContentType() および MultipartFile.getSize() それぞれ。

5
Kostas Filios