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);
それは私のローカルシステムにファイルを作成します。作りたくない。
ローカルシステムでファイルを作成せずに、MultipartFIleをJava.io.File?
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を作成してください。
質問はすでに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()
それぞれ。