Java:上传和下载文件时,如何在文件名中容纳特殊字符?
背景:Java:上传和下载文件时,如何在文件名中容纳特殊字符?,java,spring,servlets,spring-mvc,special-characters,Java,Spring,Servlets,Spring Mvc,Special Characters,背景: public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command, ModelAndView modelView, BindException errors) throws Exception { String newFileName = checkForSpecialCharsAndGetNewFileNa
public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command,
ModelAndView modelView, BindException errors) throws Exception {
String newFileName = checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename());
System.out.println("alias filename="+ newFileName);
String url = "f" + (String.valueOf(System.currentTimeMillis())) + "_" + newFileName;
String fileName = file.getOriginalFilename();
System.out.println("FileName "+ fileName);
}
//Code to replace all special characters in the incoming file with '_' symbol.
private String checkForSpecialCharsAndGetNewFileName (String originalFileName) {
final String[] splChars = {"#", "+", "$"};
String newString = originalFileName;
for (int i=0; i<splChars.length; i++)
newString = StringUtils.replace(newString, splChars[i], "_");
return newString;
}
我上传了一个文件,在此过程中,文件的链接存储在数据库中,而不是实际文件,acutal文件存储在文件系统中,目前正在本地机器中存储
目标:
我的目标是上传一个文件并正确下载一个包含特殊字符的文件-#、$、%、@etc
问题:
public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command,
ModelAndView modelView, BindException errors) throws Exception {
String newFileName = checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename());
System.out.println("alias filename="+ newFileName);
String url = "f" + (String.valueOf(System.currentTimeMillis())) + "_" + newFileName;
String fileName = file.getOriginalFilename();
System.out.println("FileName "+ fileName);
}
//Code to replace all special characters in the incoming file with '_' symbol.
private String checkForSpecialCharsAndGetNewFileName (String originalFileName) {
final String[] splChars = {"#", "+", "$"};
String newString = originalFileName;
for (int i=0; i<splChars.length; i++)
newString = StringUtils.replace(newString, splChars[i], "_");
return newString;
}
我可以上传带有特殊字符的文件,但无法下载带有特殊字符的文件。另外,我不能在下载Servlet
中做任何更改,因为它是框架的一部分,所以我只能使用上传Servlet
,所以我的重点是以这种方式上传带有特殊字符的文件,以便我可以下载它们
我尝试过为文件名创建别名,在这里,我用“
符号替换特殊字符,这种方法工作正常,可以下载文件,但此处不保留文件的实际名称,文件名中的所有特殊字符都替换为“
符号,这是不可接受的,因为用户应该知道文件的实际名称
任何建议或方法:
代码:
public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command,
ModelAndView modelView, BindException errors) throws Exception {
String newFileName = checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename());
System.out.println("alias filename="+ newFileName);
String url = "f" + (String.valueOf(System.currentTimeMillis())) + "_" + newFileName;
String fileName = file.getOriginalFilename();
System.out.println("FileName "+ fileName);
}
//Code to replace all special characters in the incoming file with '_' symbol.
private String checkForSpecialCharsAndGetNewFileName (String originalFileName) {
final String[] splChars = {"#", "+", "$"};
String newString = originalFileName;
for (int i=0; i<splChars.length; i++)
newString = StringUtils.replace(newString, splChars[i], "_");
return newString;
}
公共模型和视图保存(HttpServletRequest请求、HttpServletResponse响应、对象命令、,
ModelAndView modelView,BindException错误)引发异常{
String newFileName=checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename());
System.out.println(“别名文件名=”+newFileName);
String url=“f”+(String.valueOf(System.currentTimeMillis())+“\u3”+新文件名;
字符串文件名=file.getOriginalFilename();
System.out.println(“文件名”+文件名);
}
//将传入文件中的所有特殊字符替换为“\u1”符号的代码。
SpecialChars和GetNewFileName(字符串原始文件名)的专用字符串检查{
最后一个字符串[]splChars={“#”、“+”、“$”};
字符串newString=originalFileName;
对于(int i=0;i如果我理解正确,您希望对文件名进行编码,以便在上载和稍后下载时,能够从文件名中找到相同的文件
为此,可以使用和类
您可以执行以下操作:
String fileName;
fileName = URLEncoder.encode("My ! String #", "UTF-8");
这将对其进行编码。要获取原始文件名:
String originalFileName = URLDecoder.decode(fileName, "UTF-8");
您可以使用编码的文件名从服务下载文件。然后,您可以解码文件名以适当地存储它
希望这能有所帮助。我遇到一个问题,java.io.File
类开始自动编码包含在构造函数中传递的文件名中的波浪号
因此,例如,如果您使用“~filename”
实例化一个文件,它将在内部将其解释为%7Efilename”
,因此如果您需要读取或写入名为“~filename”
的文件,则无法执行此操作
这个问题是在我在tomcat服务器上认可了一组较新的Xalan/Xerces JAR(全套5个)时出现的。如果您删除了认可的JAR,问题就会立即消失(见图)
如果这与你的问题相似,你可能需要查看你的服务器是否使用了任何认可的XML解析罐,并考虑删除它们。我还没有找到一种方法来让新的XeRCE JAR与JavaI.Fig很好地玩,或者甚至明白为什么这里会有影响。
我不做Spring,不清楚你到底是怎么回事。“我们从客户端开始使用它,所以我不能详细说明,但值得一提的是,上面提到的字符是URL中的保留字符,需要正确地进行URL编码。我不确定如何使用Spring框架对URL进行编码,因为Spring是一个新手。在客户端,我们参考了Servelet(上传和下载Servlet)还有一点值得注意的是,即使我使用URlEncoder对URL进行编码,即使我无法下载带有特殊字符的文件,也不确定可能的原因是什么。问题是清楚的还是模棱两可?这就是我所看到的,但正如我所说,我无法进行任何修改下载Servlet,因为它是框架的一部分。我只是有一个从我的jsp文件下载Servlet的参考,所以即使我在上传Servlet中编码它,也不能在下载Servlet中解码,在调用下载Servlet之前,有没有办法在jsp文件中有解码逻辑?当您调用download servlet,您没有向其发送文件名吗?如果是,您可以在发送之前对文件名进行编码。如果不是,servlet如何获取要下载的文件名?
调用下载servlet并通过jsp页面传递url信息。您正在编写的系统正在传递attachments.url?h如果url首先使用上载servlet对其进行解码,那么如何对${attachments.url}进行编码以将实际文件名传递给servlet?