Java: Как разместить специальные символы в имени файла при загрузке и загрузке файла? - PullRequest
4 голосов
/ 19 июля 2010

Справочная информация:

У меня есть файл, который я загружаю, во время этого процесса ссылка на файл сохраняется в базе данных, а не фактический файл, текущий файл сохраняется вФайловая система, в настоящее время храню ее на моей локальной машине.

Цель:

Моя цель - загрузить файл и загрузить его правильно, в котором есть специальные символы - #,$,%,@ 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;
}

Надеюсь, здесь есть какой-то смысл.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 декабря 2012

У меня проблема с тем, что класс java.io.File начал автоматическое кодирование тильд, которые содержатся в имени файла, переданном в конструкторе.

Так, например, если вы создаете экземпляр файла с помощью "~filename", он внутренне будет интерпретировать его как "%7Efilename", так что если вам нужно прочитать или записать файл с именем "~filename", у вас нет способа сделать это.

Эта проблема возникла, когда я одобрил новый набор Xalan / Xerces jar (полный набор из 5) на сервере Tomcat. Если вы удалите одобренные банки, проблема немедленно исчезнет (см. Рисунок).

Если это похоже на вашу проблему, вам, возможно, придется посмотреть, использует ли ваш сервер какие-либо одобренные файлы XML-анализа и рассмотреть возможность их удаления. Я не нашел способа заставить более новые jerces-банки хорошо играть с java.io.File или даже понять, почему здесь есть какое-то влияние.

2 голосов
/ 19 июля 2010

Если я правильно вас понимаю, вы хотите закодировать имя файла таким образом, чтобы при загрузке, а затем при загрузке вы захотели найти тот же файл из имени файла.

КомуДля этого вы можете использовать URLEncoder и URLDecoder классов.

Вы можете сделать это, выполнив что-то вроде следующего:

String fileName;
fileName = URLEncoder.encode("My ! String #", "UTF-8");

Это будетзакодировать это.Чтобы получить исходное имя файла:

String originalFileName = URLDecoder.decode(fileName, "UTF-8");

Вы можете использовать закодированное имя файла для загрузки файла из сервиса.Затем вы можете декодировать имя файла, чтобы сохранить его соответствующим образом.

Надеюсь, это поможет.

...