如何使用URLConnection上传二进制文件

10
为了将二进制文件上传到一个URL,我被建议使用这个指南。然而,该文件不在目录中,而是存储在MySql数据库的BLOB字段中。BLOB字段被映射为JPA中的byte[]属性。
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个字节。

我的流、连接和byte[]知识太有限了,难以掌握修复方法。任何提示都将不胜感激。


编辑

如评论员建议的那样,我也尝试直接编写byte[],而不使用ByteArrayInputStream:

output.write(myEntity.getBinaryFile());

不幸的是,主机给出的答案与另一种方式完全相同。


你为什么要通过BAIS流式传输文件呢?为什么不直接从字节数组中写入呢? - Jim Garrison
еҰӮжһңдёҚдҪҝз”Ёfile.available()иҖҢжҳҜдҪҝз”Ёbyte[] temp = myEntity.getBinaryFile();并дҪҝз”Ёtemp.lengthдјҡеҸ‘з”ҹд»Җд№ҲпјҹжҲ‘жҖҖз–‘file.available()жҳҜй”ҷиҜҜзҡ„гҖӮ - Jim Garrison
在这种情况下,file.available() 函数是准确的,给出了字节数。我已经解决了这个问题:使用有太多字节的文件接收主机的提示,我删除了 Content-Transfer-Encoding 头和一个换行符,现在一切正常。无论如何,感谢您的帮助! - perissf
1个回答

6

我的代码是正确的。

主机报错是因为它不期望有 Content-Transfer-Encoding 头信息。删除这个头信息后,一切正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接