2012-02-28 9 views
2

Apache HttpComponentsのHttpClientを使用して、サードパーティのWebインターフェイスにファイルをアップロードしています。コードは次のようになります。実際にファイルを使用しないHTTPファイルのアップロード

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("UPLOAD_URL"); 
FileBody bin = new FileBody(file, filename, "text/csv", "UTF-8"); 
MultipartEntity reqEntity = new MultipartEntity(); 
reqEntity.addPart("Username", new StringBody("User")); 
reqEntity.addPart("Password", new StringBody("Password")); 
reqEntity.addPart("bin", bin); 
httppost.setEntity(reqEntity); 
HttpResponse response = httpclient.execute(httppost); 

これは期待どおりです。

このデータは機密性が高いため、クライアント側に保存する必要はありません。 (このプログラムはWebサービスからこのデータを取得しますが、アップロードする目的でファイルを作成しただけです)。

実際のファイルを使用しない方法を探していますが、メモリ内表現。代わりにInputStreamBodyを使用しようとしましたが、これらの要求は第三者システムによって拒否されます。

どのようにこれを行うことができますか?

+1

、まだあなたにはありません。だから、私はこのようなInputStreamBodyを拡張することになりましたあなたのアプリが上記のファイルにアクセスできるようにしますか?私はここで間違った質問をしていると言いたいと思います。メモリやファイルをどこに保存しても問題ありません。クライアントは*アクセスするでしょう... – Marcelo

+0

本当ですが、これはまだ可能性があります有効な要件 - ユーザーを信頼するが、機密性の高い個人データをディスク上に置くことを望まない場合 – DNA

+0

私たちのWebサービスはファイルを返すものではありません。ファイルはアップロードするためだけにクライアントアプリケーションによって作成されます。クライアントアプリケーションはこのデータにアクセスできますが、クライアントマシン上にファイルとして保存する必要はありません。データはアップロード後すぐに削除されますが、失敗する可能性があります。その場合、データは誰でもアクセスできるようにクライアントマシンに残ります。 – TPete

答えて

2

InputStreamBodyを使用しての問題は、このようになりますgetContentLength方法、であるように見えますWebインターフェイス。だからあなたのアプリケーションは、クライアントとして、プロキシのように動作し、サーバーにWebサービスとアップロード、そこからファイルを取得します...

public class NoFileBody extends InputStreamBody { 

    private final long length; 

    public NoFileBody(final InputStream in, final String mimeType, final String filename, final long length) { 
    super(in, mimeType, filename); 
    this.length = length; 
    } 

    @Override 
    public long getContentLength() { 
    return length; 
    } 

} 
0

MultipartEntityを見てください。addPartメソッドはStringとContentBodyをパラメータとして取ります。 ContentBodyは、実装が簡単なインターフェースであるようです(FileBodyが実装しています)。基本的には、writeTo(OutputStream)メソッドを記述して、データをOutputStreamに出力する必要があります。

public long getContentLength() { 
    return -1; 
} 

これは、その特定によって理解されていないことのようですチャンク HTTP POST(Transfer-Encoding: chunked)、その結果:

+0

それは私が 'InputStreamBody'を試した理由です。今すぐカスタム実装を試みます。 – TPete

+0

私があなただったら、私はFileBodyに基づいています。これは150行未満のコード(コメントを含む)です! – Eduardo

+0

あなたはそれを行うことができません: 'writeTo'は' ContentBody'インタフェースで定義されたメソッドなので、そのシグネチャを変更するだけではありません。 – TPete

関連する問題