我正在编写一个允许接收二进制文件资源的REST服务。
我正在使用RESTEXPRESS,我通过HTTP将二进制数据作为编码的base64字符串发送。
我有一个标题组合,允许将文件作为附件接收,但浏览器不会将base64解码为二进制文件。
我的目标可能吗?通过http发送任意二进制文件格式,并使浏览器自动从base64解码为二进制并保存文件。或者让浏览器触发与文件扩展名相关的应用程序?我可以透明地执行此操作还是必须使用javascript?
显示我使用的标题的代码如下所示。
public String read(Request request, Response response) throws IOException
{
response.setIsSerialized(false);
response.setContentType("application/arbitraryBinaryFileFormat");
response.addHeader("Content-Transfer-Encoding", "Base64");
response.addHeader("Content-Encoding", "Base64");
response.addHeader("Content-Disposition","attachment; filename=r.arbitraryBinaryFileFormat");
String result = encodeFileToBase64Binary("/Users/xxx/Downloads/r.arbitraryBinaryFileFormat");
response.setBody(result);
return result;
}
答案 0 :(得分:2)
Base64
不是有效的HTTP Content-Encoding
值。请参阅IANA上的official list of registered encodings。
Content-Transfer-Encoding
是一个MIME标头,根本不与HTTP一起使用(请参阅RFC 2616 Section 19.4.5)。
简而言之,HTTP没有base64的概念,因此无法强制HTTP客户端自动解码base64编码数据。您应该以原始二进制格式发送文件数据,而不是将其编码为base64。例如,您可以将byte[]
数组而不是string
传递给response.setBody()
。
对于基于文件名调用应用程序,使用Content-Disposition: attachment; filename="..."
标头是正确的解决方案。您应该将Content-Type
设置为适合文件扩展名的实际合法值,或者使用application/octet-stream
代替。