0

最初にコードを書きます: 注: 質問の最後にログ出力もあります。

サーバ側:

@Post
@Consumes("application/octet-stream")
public Representation post(InputStream zip, @HeaderParam(value = "Content-Disposition") HttpHeaders headers) throws Throwable {
    System.out.println(headers); //Prints null - want the header to not be null here
    String uploadedFileLocation = getStartingDir() + "/" + "abc.zip";
    writeToFile(zip, uploadedFileLocation); 
    return new StringRepresentation("Uploaded!");
}

クライアント側:

public static void main(String[] args) throws Exception {
    final String BASE_URI = "http://localhost:8080/server/upload";

    Client client = Client.create();
    WebResource service = client.resource(BASE_URI);
    client.setChunkedEncodingSize(1024);
    client.addFilter(new LoggingFilter());


    File zip = new File("C:/Users/sdery/Desktop/abc.zip");

    InputStream fileInStream = new FileInputStream(zip);
    String sContentDisposition = "attachment; filename=\"" + zip.getName()+"\"";     
    ClientResponse response = service.header("Authorization", "Basic xxx=").header("Content-Disposition", (Object)sContentDisposition).type(MediaType.APPLICATION_OCTET_STREAM).post(ClientResponse.class, fileInStream);     
    System.out.println("Response Status : " + response.getEntity(String.class));

}

まず、ファイル転送が機能します。満足しています。ただし、サーバー側でヘッダーを取得したいので、ファイル名をハードコーディングする必要はありません。なぜそれがゼロになるのかについてのアイデアはありますか? ClientResponseの代わりに使用することと関係がありClientRequestますか?

Jul 31, 2013 8:44:12 AM com.sun.jersey.api.client.filter.LoggingFilter log
INFO: 1 * Client out-bound request
1 > POST http://localhost:8080/server/upload
1 > Content-Disposition: attachment; filename="abc.zip"
1 > Authorization: Basic xxx=
1 > Content-Type: application/octet-stream

(zip bytes)

INFO: 1 * Client in-bound response
1 < 200
1 < Date: Wed, 31 Jul 2013 12:44:12 GMT
1 < Date: Wed, 31 Jul 2013 12:44:12 GMT
1 < Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
1 < Content-Length: 88
1 < Set-Cookie: rememberMe=deleteMe; Path=/server; Max-Age=0; Expires=Tue, 30-Jul-2013   12:44:12 GMT
1 < Content-Type: text/plain; charset=UTF-8
1 < Accept-Ranges: bytes
1 < Server: Restlet-Framework/2.0.4
1 < Real-Token: bar
1 < 
Uploaded!

ログ出力から、ヘッダーが含まれているようですContent-Disposition。これは、サーバー側のコードから値を取得できる必要があるということですか?

4

2 に答える 2

0

まず、私の解決策が Java ではなく JavaScript/PHP リファレンスからのものであることをお詫びしますが、あなたの解決策は似ていると思います。

「X-FILENAME」という名前の新しいヘッダーを追加し、ファイルの名前をヘッダー データとして設定します。あなたのコードは次のようになると思います:

ClientResponse response = service.header("X-FILENAME", "abc.zip");

次に、サーバーでそのヘッダーパラメーターを取得できるはずです(PHPでは$_SERVERグローバルであり、あなたのものではそうかもしれません@HeaderParam)。

また、これが当てはまる場合の参考として、PHP でヘッダー パラメータを取得するときに、先頭に「HTTP_」を追加し、この「HTTP_X_FILENAME」のようにすべてのダッシュをアンダースコアに変更して、変更されたパラメータ名を使用する必要があります。したがって、クライアントでは「X-FILENAME」を送信し、サーバーでは「HTTP_X_FILENAME」で同じ値を取得します。

これがあなたを正しい方向に導くことを願っています。

于 2013-07-30T16:52:43.577 に答える