我正在使用 Jersey 进行文件上传,但我只需要文件名。Internet Explorer 发送整个路径,并根据 FormDataContentDisposition 中的内容,Jersey 解析出斜线,所以我什至无法解析它。谢谢。
4 回答
听起来是个棘手的问题。理想的情况当然是获取包含斜杠的字符串,然后使用 string.split!
如果做不到这一点,我可以开始想到的唯一策略是尝试遍历字符串,看看是否存在用于字符串第一部分的各种长度的文件夹等。这也可能会导致问题,但如果你打算找到一个文件夹“MyFolder” (2)”,还有一个“MyFolder”。我对球衣了解不多,但我建议尝试找到一种不同的方式来抓住你需要的绳子。
- 向文件输入标签添加更改事件
- 解析文件名,因为此时它仍然有斜杠
- 将该值粘贴到隐藏的输入中
然后,隐藏的输入与表单的其余部分一起提交。
@kombat 找到了这个解决方案并将其作为评论发布。为了更好,现在将其重新发布为社区 wiki 答案。
这是泽西岛的一个错误。在 Nabble 讨论http://jersey.576304.n2.nabble.com/Jersey-truncating-the-slashes-from-the-uploaded-file-name-td5984041.html中,该错误的作者揭示了自己并承认“重用用于解析 HTTP 标头以解析Content-Disposition
. 但是,引用的 RFC 2616 没有指定Content-Disposition
字段将根据指定给 HTTP 标头的规则进行转义。正好相反,上面写着:
Content-Disposition 不是 HTTP 标准的一部分,但由于它被广泛实施,我们正在为实施者记录它的使用和风险。
这个错误已经在 Jersey 的org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide
实际版本中的类中有一个丑陋的解决方法,但是它不适用于 IE 11 和 Edge,因为它会检查已更改的 User-Agent 部分。有一个修复请求:https ://github.com/jersey/jersey/pull/233/files ,但近 2 年来没有人愿意合并它。
您有 3 个解决方案:
1)在客户端应用“修复”,恕我直言,这是一种错误的方法,因为客户端没有错误,错误在泽西岛!
2) 将 Jersey 更改为其他框架,其中开发人员更重视兼容性问题,而不是专注于最大化代码重用等。
3) 手动修补泽西岛。下载源代码,应用拉取请求,使用修改后的版本号编译和发布。
我在尝试 Eclipse 浏览器时遇到了这个错误。当我在 Chrome 上尝试我的代码时,FormDataContentDisposition.getFileName() 很好。