2

バイナリファイルをクライアントに送信する方法に関するこの質問に関連しています。私はこれを行っていますが、実際には私のメソッド @Produces("application/zip") であり、ブラウザー クライアントでうまく機能します。現在、Wink クライアントを使用して、残りのサービスに対していくつかの自動化されたテストを作成しようとしています。したがって、私の質問は、ファイルをクライアントに送信する方法ではなく、Java REST クライアント (この場合は Apache Wink) としてファイルを使用する方法です。

私のリソース メソッドは次のようになります... Wink ClientResponse オブジェクトを取得したら、そこからファイルを取得して操作できるようにするにはどうすればよいですか?

  @GET
  @Path("/file")
  @Produces("application/zip")
  public javax.ws.rs.core.Response getFile() {

    filesToZip.put("file.txt", myText);

    ResponseBuilder responseBuilder = null;
    javax.ws.rs.core.Response response = null;
    InputStream in = null;
    try {

      in = new FileInputStream( createZipFile( filesToZip ) );
      responseBuilder = javax.ws.rs.core.Response.ok(in, MediaType.APPLICATION_OCTET_STREAM_TYPE);
      response = responseBuilder.header("content-disposition", "inline;filename="file.zip").build();

    } catch( FileNotFoundException fnfe) {
          fnfe.printStackTrace();
    }

    return response;

実際にzipファイルを作成する方法はこんな感じ

  private String createZipFile( Map<String,String> zipFiles ) {

    ZipOutputStream zos = null;
    File file = null;

    String createdFileCanonicalPath = null;

    try {

      // create a temp file -- the ZIP Container
      file = File.createTempFile("files", ".zip");
      zos = new ZipOutputStream( new FileOutputStream(file));

      // for each entry in the Map, create an inner zip entry

      for (Iterator<Map.Entry<String, String>> it = zipFiles.entrySet().iterator(); it.hasNext();){

        Map.Entry<String, String> entry = it.next();
        String innerFileName = entry.getKey();
        String textContent = entry.getValue();

        zos.putNextEntry( new ZipEntry(innerFileName) );
        StringBuilder sb = new StringBuilder();
        byte[] contentInBytes = sb.append(textContent).toString().getBytes();
        zos.write(contentInBytes, 0, contentInBytes.length);
        zos.closeEntry();        
      }

      zos.flush();
      zos.close();

      createdFileCanonicalPath = file.getCanonicalPath(); 

    } catch (SecurityException se) {
      se.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (zos != null) {
          zos.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

    return createdFileCanonicalPath;

  }
4

1 に答える 1

1

単純に入力ストリームとして使用ZipInputStreamし、解凍に使用できます。

ApacheHTTPクライアントを使用した例を次に示します。

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    get.addHeader(new BasicHeader("Accept", "application/zip"));
    HttpResponse response = httpclient.execute(get);
    InputStream is = response.getEntity().getContent();
    ZipInputStream zip = new ZipInputStream(is);
于 2013-03-07T09:13:14.297 に答える