英文:
Java OutputStream produces wrong directory path and characters
问题
我正在使用 OutputStream 创建一个用于下载的 PDF 文件,代码如下:
byte[] infoFile = info.getBytes();
String infoName = info.getFileName();
String contentType = info.getContentType();
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment;filename=\"" + infoName + "\"");
response.setContentLength(infoFile.length);
// 到目前为止都没有问题,文件名是正确的
OutputStream out = response.getOutputStream();
out.write(infoFile);
// 在这里,一旦执行了上一行代码,就会生成一个带有错误字符的文件
// 例如:D:__Profiles__User__Downloads__infoFile.pdf
在这里生成的文件名称类似于 "D:__Profiles__User__Downloads__infoFile.pdf",
而我期望的文件名是 "D:\Profiles\User\Downloads\infoFile.pdf"。
出了什么问题?
英文:
i'm using OutputStream to create a pdf file for download as follow:
byte[] infoFile = info.getBytes();
String infoName = info.getFileName();
String contentType = info.getContentType();
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment;filename=\"" + infoName + "\"");
response.setContentLength(infoFile.length);
// till now no problem, the file name is ok
OutputStream out = response.getOutputStream();
out.write(infoFile);
//here, as soon as the previous line is executed a file is generated with wrong characters
// ex. D:__Profiles__User__Downloads__infoFile.pdf
Here the file produced is something like "D:__Profiles__User__Downloads__infoFile.pdf"
while i expect the file "D:\Profiles\User\Downloads\infoFile.pdf"
What's wrong?
答案1
得分: 2
以下是翻译好的内容:
有什么问题吗?
你期望在内容分发头中的文件名应包含路径信息。
收件人不得能够写入除他们专门有权访问的位置以外的任何位置。为了说明这个问题,考虑能够覆盖众所周知的系统位置(比如“/etc/passwd”)的后果。实现这一目标的一种策略是永不相信文件名参数中的文件夹名信息,例如仅保留最后一个路径片段,并只考虑实际文件名(其中“路径片段”是字段值中由路径分隔符字符“\”和“/”分隔的组件)。
同样地,在Mozilla文档
文件名始终是可选的,且不得被应用程序盲目使用:应剥离路径信息,并进行转换以符合服务器文件系统规则。
基本上,你应该只指定infoFile.pdf。将文件保存在哪个目录取决于用户。
英文:
> What's wrong?
Your expectation that the filename in a Content-disposition header should have path information.
From RFC 6266 section 4.3
> Recipients MUST NOT be able to write into any location other than
> one to which they are specifically entitled. To illustrate the
> problem, consider the consequences of being able to overwrite
> well-known system locations (such as "/etc/passwd"). One strategy
> to achieve this is to never trust folder name information in the
> filename parameter, for instance by stripping all but the last
> path segment and only considering the actual filename (where 'path
> segments' are the components of the field value delimited by the
> path separator characters "" and "/").
And similarly in the Mozilla docs
> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done.
Basically you should only be specifying infoFile.pdf. It's up to the user which directory that file is saved in.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论