使用浏览器保存通过http发送的base64编码数据

时间:2014-03-05 18:00:36

标签: javascript http rest browser base64

我正在编写一个允许接收二进制文件资源的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;
    }

1 个答案:

答案 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代替。