11

バイナリ ファイルを URL にアップロードするには、このガイドを使用するように勧められました。ただし、ファイルはディレクトリではなく、MySql db の BLOB フィールドに格納されています。BLOB フィールドはbyte[]、JPA のプロパティとしてマップされます。

byte[] binaryFile;

この方法で、ガイドから取得したコードをわずかに変更しました。

HttpURLConnection connection = (HttpURLConnection ) new URL(url).openConnection();
// set some connection properties
OutputStream output = connection.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, CHARSET), true); 
// set some headers with writer
InputStream file = new ByteArrayInputStream(myEntity.getBinaryFile());
System.out.println("Size: " + file.available());
try {
    byte[] buffer = new byte[4096];
    int length;
    while ((length = file.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    } 
    output.flush();
    writer.append(CRLF).flush();
    writer.append("--" + boundary + "--").append(CRLF).flush();
} 
// catch and close streams

チャンク ストリーミングは使用していません。使用されるヘッダーは次のとおりです。

username and password
Content-Disposition: form-data; name=\"file\"; filename=\"myFileName\"\r\nContent-Type: application/octet-stream"
Content-Transfer-Encoding: binary

すべてのヘッダーがホストによって正しく受信されます。アップロードされたファイルも受信しますが、残念ながらファイルが読み取れないと不平を言い、受信したファイルのサイズがコードによって出力されたサイズよりも 37 バイト大きいと主張します。

ストリーム、接続、およびバイト [] に関する私の知識は、これを修正する方法を把握するにはあまりにも限られています。ヒントをいただければ幸いです。


編集

コメンターが示唆したように、ByteArrayInputStream を使用せずに、byte[] を直接書き込もうとしました。

output.write(myEntity.getBinaryFile());

残念ながら、ホストは他の方法とまったく同じ答えを出します。

4

1 に答える 1

6

私のコードは正しかった。

Content-Transfer-Encodingホストはヘッダーを予期していなかったため、エラーを出していました。それを削除した後、すべてがうまくいきました。

于 2012-11-20T20:58:35.723 に答える