2012-05-02 6 views
4

Я использую Primefaces 3.2. У меня возникли проблемы с использованием файловых полей fileDownload. Я могу загрузить файлы и сохранить их неанглийское имя на сервере (в моем случае это русский). Однако, когда я использую p: fileDownload для загрузки загруженных файлов, я не могу использовать русские буквы, так как они становятся коррумпированными. Кажется, что конструктор класса DefaultStreamedContent принимает только латинские буквы. Я делаю все в соответствии с витриной на веб-сайте perffaces, как показано ниже.Файл с главными файламиЗагрузить неправильные имена файлов, поврежденные

public FileDownloadController() {   
    InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/images/optimusprime.jpg"); 
    file = new DefaultStreamedContent(stream, "image/jpg", "downloaded_optimus.jpg"); 
} 

Любые идеи, как я могу решить свою проблему?

Спасибо, заранее.

+0

Я завален, но вы можете связать файл в качестве примера? Я разорвал этот сервлет отдельно 4 месяца назад, и я был бы счастлив запустить его через отладчик, если у меня есть что-то использовать. –

+0

Вы имеете в виду файл, который я использовал? Как я могу связать его здесь? Я использовал файл .docx с русским именем. Если вам это не сложно, вы можете создать любой файл .doc или .docx и дать ему имя на русском «Тестовый файл» (тестовый файл). – Nurjan

+1

Извините за задержку: я не смог воссоздать, но вот где вы хотите посмотреть: http://code.google.com/p/primefaces/source/browse/primefaces/trunk/src/main/java /org/primefaces/webapp/MultipartRequest.java В основном он построен поверх ApacheFileUpload и использует этот метод (parseRequest) для его выполнения. Кроме того, убедитесь, что ваш набор символов правильный, и он не передает потоки в ASCII или что-то глупое, когда он сохраняет. –

ответ

11

Это fixed in the upcoming PrimeFaces 6.2, но для более ранних версий необходимо применить исправление ниже. В ссылке, приведенной ниже, была опубликована ссылка на проблему PrimeFaces, в которой содержится информация о том, что исправление ниже работает для Chrome, IE и Opera, но не для FireFox (упомянутая версия не упомянута, а также не упоминается «Edge»)

Обход

Try закодировать ваше имя файла в формате MIME application/x-www-form-urlencoded (URLEncoder).

Пример:

public StreamedContent getFileDown() { 
     // Get current position in file table 
     this.currentPosition(); 
     attachments = getAttachments(); 
     Attachment a = getAttachmentByPosition(pos, attachments); 

     FileNameMap fileNameMap = URLConnection.getFileNameMap(); 
     // Detecting MIME type 
     String mimeType = fileNameMap.getContentTypeFor(a.getAttachmentName()); 
     String escapedFilename = "Unrecognized!!!"; 
     try { 
      // Encoding 
      escapedFilename = URLEncoder.encode(a.getAttachmentName(), "UTF-8").replaceAll(
        "\\+", "%20"); 
     } catch (UnsupportedEncodingException e1) {   
      e1.printStackTrace(); 
     } 
     // Preparing streamed content 
     fileDown = new DefaultStreamedContent(new ByteArrayInputStream(a.getAttachment()), 
       mimeType, escapedFilename); 
     return fileDown; 
    } 
+0

Спасибо за ответ. Это сработало для вас? – Nurjan

+0

Да, он отлично подходит для меня с русскими и украинскими именами файлов. – Andrew

+0

Спасибо, это сработало для меня, однако отображаемое имя, которое я получил через свойство name DefaultStreamedContent, также закодировано в url. – Nurjan