Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Кракозябра в названии файла при скачивании


Автор: m0zg 30.3.2012, 10:26
Вроде были похожие темы, но с решениями не очень. Вот кусок кода:

Код

response.setHeader("Content-Disposition", "inline;filename=\"" + md.getFileName() + "\"");
OutputStream out = response.getOutputStream();
response.setContentType(md.getContentType());
File f = new File(StringUtils.getPath() + md.getId() + "-" + md.getFileName());
fis = new FileInputStream(f);
IOUtils.copy(fis, out);


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

Автор: MisterCleric 30.3.2012, 10:56
Привет.
Проблема лежит в в кодировке символов. При чем каждый браузер это название файла отображает по своему.
А вот тебе и решение:
Код

public class ContentDispositionBuilder {
    private static final String ENCODING = "UTF-8";

    private HttpServletRequest request;

    private HttpServletResponse response;

    private String userAgent;

    public ContentDispositionBuilder(HttpServletRequest request, HttpServletResponse response) {
        this.request = request;
        this.response = response;
    }

    public void build(String originalFileName) throws UnsupportedEncodingException {
        userAgent = request.getHeader("User-Agent").toLowerCase();

        String fileName = buildFileName(originalFileName);

        String fileNameAttr = "filename=";

        if (isIE() || isChrome()) {
            fileName = "\"" + fileName + "\"";

        } else {
            fileNameAttr = fileNameAttr.replace("=", "*=") + ENCODING + "''";
        }

        response.setHeader("Content-Disposition", "attachment;" + fileNameAttr + fileName);
    }

    private String buildFileName(String fileName) throws UnsupportedEncodingException {
        return URLEncoder.encode(fileName, ENCODING).replaceAll("\\+", "%20");
    }

    private boolean isFirefox() {
        return userAgent.contains("gecko");
    }

    private boolean isIE() {
        return userAgent.contains("msie");
    }

    private boolean isOpera() {
        return userAgent.contains("opera");
    }

    private boolean isChrome() {
        return userAgent.contains("webkit");
    }
}

Автор: m0zg 30.3.2012, 11:42
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)