Java:如何在上传和下载文件时在文件名中包含特殊字符?

Rac*_*hel 6 java spring servlets spring-mvc special-characters

背景:

我有一个我上传的文件,在此过程中,文件的链接存储在数据库中,而不是实际文件中,实际文件存储在文件系统中,目前将其存储在我的本地机器中。

目标:

我的目标是上传一个文件并正确下载一个包含特殊字符的文件 - #,$,%,@ etc.

问题:

我可以上传带有特殊字符的文件,但无法下载带有特殊字符的文件。此外,我无法对 进行任何更改,Download Servlet因为它是 的一部分Framework,所以我只能使用Upload 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;
}
Run Code Online (Sandbox Code Playgroud)

希望在这里有意义。

谢谢。

ape*_*ins 6

如果我对您的理解正确,您希望对文件名进行编码,以便在上传和稍后下载时能够从文件名中找到相同的文件。

为此,您可以使用URLEncoderURLDecoder类。

您可以执行以下操作:

String fileName;
fileName = URLEncoder.encode("My ! String #", "UTF-8");
Run Code Online (Sandbox Code Playgroud)

这将对其进行编码。获取原始文件名:

String originalFileName = URLDecoder.decode(fileName, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

您可以使用编码的文件名从服务下载文件。然后您可以解码文件名以适当地存储它。

希望有帮助。