Jerseyで、Restのファイルアップロード
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(); } } }