我使用Spring,Apache CXF创建Java 7 REST服务。
public SuccessfulResponse uploadFile(@Multipart("report") Attachment attachment)
我使用“Content-Disposition”参数来检索文件名。我已经阅读了一些用于下载文件的解决方案(例如,url-encoding)。但是如何处理非ASCII文件名进行上传?它是客户端还是服务器端解决方案?可以更改上述方法的签名。客户端使用html5文件api + iframe。
答案 0 :(得分:1)
我的经验是内容处理一般不会处理UTF8。您可以简单地为文件名添加另一个多部分字段 - 多部分字段支持字符集指示,并在正确完成时处理UTF8字符。
答案 1 :(得分:0)
您可以使用UTF8作为文件名(根据https://tools.ietf.org/html/rfc6266和https://tools.ietf.org/html/rfc5987)。对于Spring,最简单的方法是使用org.springframework.http.ContentDisposition
类。例如:
ContentDisposition disposition = ContentDisposition
.builder("attachment")
.filename("репорт.export", StandardCharsets.UTF_8)
.build();
return ResponseEntity
.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(HttpHeaders.CONTENT_DISPOSITION, disposition.toString())
.body((out) -> messageService.exportMessages(out));
这是从服务器发送文件(下载)的示例。要上传文件,您可以遵循相同的RFC,即使Content-Disposition标头也必须在浏览器上通过JavaScript进行准备,例如:
Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates
在这种情况下,参数filename
是可选的,并且是不支持RFC 6266(包含ASCII文件名)的系统的后备。 filename*
的值必须是已编码的URL(https://www.url-encode-decode.com)。