Файл PrimefacesСкачать файлы с неанглийскими именами повреждены

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

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

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

Заранее спасибо.


person Nurjan    schedule 02.05.2012    source источник
comment
Я запутался, а можно ссылку на файл для примера? Я разобрал этот сервлет 4 месяца назад и был бы счастлив запустить его через отладчик, если бы мне было что использовать.   -  person Daniel B. Chapman    schedule 02.05.2012
comment
Вы имеете в виду файл, который я использовал? Как я могу связать это здесь? Я использовал файл .docx с русским названием. Если вам не сложно, вы можете создать любой файл .doc или .docx и дать ему имя на русском языке Тестовый файл (Test file).   -  person Nurjan    schedule 03.05.2012
comment
Извините за задержку: мне не удалось воссоздать, однако вот где вы хотите посмотреть: code.google.com/p/primefaces/source/browse/primefaces/trunk/src/ В основном он построен на верхней части ApacheFileUpload, и для этого используется этот метод (parseRequest). Кроме того, убедитесь, что ваш набор символов правильный и он не транслируется в ASCII или что-то глупое при сохранении.   -  person Daniel B. Chapman    schedule 09.05.2012
comment
Спасибо за ответ )).   -  person Nurjan    schedule 15.05.2012


Ответы (1)


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

Временное решение

Попробуйте закодировать имя файла в формате application/x-www-form-urlencoded MIME (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;
    }
person Andrew    schedule 24.02.2013
comment
Да, у меня нормально работает с русскими и украинскими именами файлов. - person Andrew; 27.02.2013
comment
Спасибо, у меня это сработало, однако отображаемое имя, которое я получаю через свойство имени DefaultStreamedContent, также кодируется в URL-адресе. - person Nurjan; 01.03.2013
comment
@Нуржан Не совсем понял, что ты имел в виду. Для отображения имен файлов на странице я получаю имя файла непосредственно из объекта Attachment. Если вам нужно декодировать этот формат, используйте URLDecoder< /а> - person Andrew; 05.03.2013
comment
В этой ссылке на PrimeFaces Github есть дополнительная информация: похоже, он не работает на FireFox (версии не упоминаются, поэтому ваш пробег может отличаться). Но эта проблема помечена как дубликат другой проблемы github.com/primefaces/primefaces/issues/1312. в котором говорится, что это будет исправлено в следующем выпуске 6.2. - person Kukeltje; 19.11.2017