Java OutputStream生成错误的目录路径和字符

Java OutputStream生成错误的目录路径和字符,java,filenames,outputstream,Java,Filenames,Outputstream,我正在使用OutputStream创建一个pdf文件供下载,如下所示: byte[] infoFile = info.getBytes(); String infoName = info.getFileName(); String contentType = info.getContentType(); response.setContentType(contentType); response.setHeader("Conte

我正在使用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);
        
    // 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
这里生成的文件类似于“D:_Profiles__User__Downloads__infoFile.pdf” 我希望文件“D:\Profiles\User\Downloads\infoFile.pdf”

怎么了

怎么了

您希望内容处置标头中的文件名应具有路径信息

收件人不能写入任何位置,除非 他们特别有权享有的权利。举例说明 问题,考虑能够重写的后果 众所周知的系统位置(如“/etc/passwd”)。一个策略 要实现这一点,请永远不要信任文件夹中的文件夹名称信息 filename参数,例如,除去最后一个 路径段,仅考虑实际文件名(其中“路径 “段”是由分隔符分隔的字段值的组成部分 路径分隔符“”和“/”)

同样地,在

文件名始终是可选的,应用程序不能盲目使用:应该删除路径信息,并转换为服务器文件系统规则


基本上,您应该只指定
infoFile.pdf
。由用户决定文件保存在哪个目录。

infoName的值是多少?“where”是用错误的字符生成的名称吗?Java
OutputStream
根本不生成目录,也不生成字符。注意:您不需要设置
内容长度
。当文件可能被不具有相同文件系统的文件下载时,指定完整路径没有什么意义。或者,事实上,任何文件系统。@Jon Skeet谢谢你的回复。@Jon Skeet:谢谢。你的评论真的很有用。它帮助我理解了某些事情。顺便说一句,我的问题是OutputStream在文件名中创建了错误的字符。这个旧代码不是我的,我只是干预来修复这个行为。最后我动态地更改了文件名如下:
code
String baseUrl=String newFilePath=FilenameUtils.getBaseName(infoName)+“+FilenameUtils.getExtension(infoName);FilenameUtils.getPath(infoName)
code
使用此解决方案,文件以正确的方式显示。@AmiStack:需要注意的是,您对
OutputStream
的强调是错误的
OutputStream
本身只是一个抽象类。它根本没有任何文件的概念。是
getOutputStream()
方法决定使用
OutputStream
的具体子类以及如何配置它。(不幸的是,我们甚至不知道
响应的类型,因此很难说更多。)感谢您的澄清。我的错误。