文件名中的国际字符以多部分形式提供
我使用Apache HTTP组件(4.1-alpha2)将文件上传到Dropbox。 这是使用多部分表单数据完成的。 以包含国际(非ascii)字符的多部分形式对文件名进行编码的正确方法是什么?
如果我使用标准API,服务器将返回一个HTTP状态Forbidden。 如果我修改上传代码,以便文件名为urlencoded:
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
FileBody bin = new FileBody(file_obj, URLEncoder.encode(file_obj.getName(), HTTP.UTF_8), HTTP.UTF_8, HTTP.OCTET_STREAM_TYPE );
entity.addPart("file", bin);
req.setEntity(entity);
该文件已上传,但最终还是编码了一个文件名。 例如%D1%82%D0%B5%D1%81%D1%82.txt
为了解决这个问题,专门为Dropbox服务器,我必须在UTF8中编码文件名。 要做到这一点,我必须声明我的多部分实体如下:
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName(HTTP.UTF_8));
由于OAuth签名实体与实际发送的实体不匹配(正在进行URL编码),因此我得到了禁止。
对于那些对这个标准有什么看法感兴趣的人,我做了一些关于RFC的阅读。 如果标准严格遵守,那么所有的头文件应该被编码为7bit,这将使得utf8编码的文件名是非法的。 然而RFC2388()指出:
也可以提供原始的本地文件名,或者作为“content-disposition:form-data”头中的“filename”参数,或者在多个文件的情况下,在“content-disposition:file”头中的子部分。 发送应用程序可以提供一个文件名; 如果发件人操作系统的文件名不是US-ASCII,则文件名可能会近似,或者使用RFC 2231的方法进行编码。
许多帖子都提到使用rfc2231或rfc2047编码7位非US-ASCII中的标头。 然而rfc2047在第5.3节中明确规定,编码的字绝不能用于Content-Disposition字段。 这只会留下rfc2231,但这是一个扩展,不能依赖在所有服务器中实现。 实际情况是,大多数主流浏览器都以UTF-8格式发送非US-ASCII字符(因此Apache HTTP客户端中的HttpMultipartMode.BROWSER_COMPATIBLE模式),因此大多数Web服务器都会支持这一点。 另外需要注意的是,如果您在多部分实体上使用HttpMultipartMode.STRICT,则该库实际上将在文件名S中用非ASCII代替问号(?)。
我原以为FileBody
的实现将负责应用RFC 2047本身的适当规则。 文件=?UTF-8?Q?=D1=82=D0=B5=D1=81=D1=82.txt?=
被编码为=?UTF-8?Q?=D1=82=D0=B5=D1=81=D1=82.txt?=
或类似的东西。
快速解决:
new String(multipartFile.getOriginalFilename().getBytes ("iso-8859-1"), "UTF-8");
链接地址: http://www.djcxy.com/p/3775.html
上一篇: International characters in filename in mutipart formdata