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?