バイナリ ファイルを 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());
残念ながら、ホストは他の方法とまったく同じ答えを出します。