ファイルアップロード方法

JavaのRestのフレームワークのJerseyで、ファイルアップロードの
サービスを組むことができます。
比較的に簡単に組める感じがします。
Restで、ファイルをアップする場合、MultiPart形式で、リクエストを受けるようにします。
jerseyは、アノテーションでRestのサービスとして定義していきます。
クラスに@Pathを記述して、メソッドに@POSTと@Pathを指定します。
これで、Restのサービスとして認識されます。

@Path("/service")
public class FileResource {
      @POST
      @Path(value="/fileUpload")
      public String fileUpload(MultiPart multiPart) {
      }

また、MultiPart形式のリクエストを受ける場合は、メソッドに下のアノテーションを付加します。

@Consumes(MediaType.MULTIPART_FROM_DATA)
@Produces(MediaType.APPLICATION_XML)

全体的な実装は、下の様な感じになります。

import java.io.BufferedInputStream;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.springframework.stereotype.Service;
import com.sun.jersey.multipart.BodyPart;
import com.sun.jersey.multipart.BodyPartEntity;
import com.sun.jersey.multipart.MultiPart;

@Path("/service")
@Service("fileResource")
public class FileResource {
      @POST
      @Path(value="/fileUpload")
      @Consumes(MediaType.MULTIPART_FROM_DATA)
      @Produces(MediaType.APPLICATION_XML)
      public String fileUpload(MultiPart multiPart) {
            List<BodyPart> bodyPartList = multiPart.getBodyParts();
            for (BodyPart bodyPart : bodyPartList) {
                  BodyPartEntity bodyPartEntity = 
                                        (BodyPartEntity)bodyPart.getEntity();
                   BufferedInputStream bf = 
                        new BufferdInputStream(
                               bodyPartEntity.getInputStream());
                   byte[] fbytes = new byte[1024];
                   try {
                          while((bf.read(bytes)) >= 0) {
                               System.out.println(new String(fbytes));
                          }
                   } catch(Exception ex) {
                         ex.printStackTrace();
                   }
            }
            return "true";
      }
}

Javaで、呼び出す場合もJerseyを使って呼び出します。
ファイルは、InputStreamをMultiPart形式にして、サービスを呼び出します。
まず、呼び出しを行うWebResourceオブジェクトを生成します。
WebResourceオブジェクトの生成には、手順があります。
最初にClientクラスのオブジェクトが必要になります。
Clinetクラスは、createメソッドでClientクラスのオブジェクトを取得することができます。
createメソッドは、引数として、ClientConfigクラスのオブジェクトが必要です。
例としては、下記の様にClientクラスのオブジェクトを取得します。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);

取得したClientクラスのオブジェクトを使いWebResourceクラスのオブジェクトを取得します。
ClientクラスにあるresourceメソッドからWebResourceクラスのオブジェクトを取得できます。
resorceメソッドは、引数として、UriBuilderクラスを利用して、Restサービスの呼び出しURLをbuildしたオブジェクトが必要です。
例としては、下記の様にWebResourceクラスのオブジェクトを取得します。

String url = "http://localhost:8080/FileResource_1_0/FileResource/service/fileUpload";
WebResource resource = client.resource(UriBuilder.fromUri(url).build());

WebResourceクラスのオブジェクトができれば、呼び出しを行うことが可能になります。
ファイルをMultiPart形式にするには、MultiPartクラスを使います。

MultiPart multiPart = new MultiPart();
FileInputStream fileInputStream = new FileInputStream("data.txt");
multiPart.bodyPart(new BodyPart(fileInputStream, MediaType.APPLICATION_OCTET_STREAM_TYPE));

実装は、下の様な感じになります。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.multipart.BodyPart;
import com.sun.jersey.multipart.MultiPart;

public class Test {
     public static void main(String[] args) {
           String url = "http://localhost:8080/FileResource_1_0/FileResource/service/fileUpload";
           MultiPart multiPart = new MultiPart();
           try {
                 ClientConfig config = new DefaultClientConfig();
                 Client client = Client.create(config);
                 WebResource service = client.resource(UrlBuilder.fromUri(url).build());
                FileInputStream fileInputStream = new FileInputStream("data.txt");
                 multiPart.bodyPart(
                     new BodyPart(fileInputStream, MediaType.APPLICATION_OCTET_STREAM_TYPE));
                 String res = service.type(MediaType.MULTIPART_FORM_DATA).
                                                accept(MediaType.APPLICATION_XML).post(String.class, multiPart);
                 System.out.println(res);
           } catch(FileNotFoundException ex) {
                 ex.printStackTrace();
           }
     }
}