Загрузка файлов через Spring не работает в Firefox - PullRequest
1 голос
/ 30 декабря 2011

Я написал программу для загрузки и выгрузки файлов (.doc, .xls и .txt) из БД (mySQL). Он написан с использованием Spring MVC. Выгрузка и загрузка работает правильно в IE, однако в Firefox это не работает как исключение.

Для загрузки файла в JSP предоставляется ссылка, при нажатии которой появляется диалоговое окно «Загрузка файла». В IE это диалоговое окно появляется и позволяет открывать и / или сохранять файл в правильном формате (т.е. .doc, .xls и / или .txt).

В Firefox при нажатии на ссылку делает следующее:

  1. Для файлов .doc открывает файлы (без всплывающего окна «Загрузка файла»)
  2. Для файлов .xls отображается всплывающее окно «Загрузка файла», однако расширение файла не принимается как .xls, а принимается как file.do

Класс FileController

public class FileController extends AbstractFormController{
SearchResultService searchResultService;

public void setSearchResultService(SearchResultService searchResultService){
this.searchResultService = searchResultService;
}


@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ResultSet result = searchResultService.getAttachment(Integer.parseInt(arg0.getParameter("prbId")));
byte[] buff = new byte[100000];
try {
result.next();
if(!(result.getBinaryStream(1)==null)){
String filename = "fname."+result.getString("file_ext");
if(result.getString("file_ext").equals("txt")){
InputStream is = result.getBinaryStream(1);
OutputStream out = arg1.getOutputStream();
arg1.reset();
int bytesRead;
while ((bytesRead = is.read(buff)) != -1) {
out.write(buff, 0, bytesRead);
}
arg1.setContentType("");
arg1.setHeader("content-disposition", "attachment; filename="+filename);
is.close();
out.flush();
out.close();
}else{
arg1.reset();
if(result.getString("file_ext").equals("doc")||result.getString("file_ext").equals("docx")){
arg1.setContentType("application/msword");
}else if(result.getString("file_ext").equals("xls")||result.getString("file_ext").equals("xlsx")){
arg1.setContentType("application/vnd.ms-excel");
}else if(result.getString("file_ext").equals("pdf")){
arg1.setContentType("application/pdf");
}
arg1.setHeader("Content-Desposition","attachment; filename="+filename);
byte[] bytesGot = result.getBytes(1);
ServletOutputStream outs = arg1.getOutputStream();
outs.write(bytesGot);
outs.flush();
outs.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return new ModelAndView();
}
}

JSP, которая вызывает класс FileController

<a href="<%=contextPath%>/file.do?prbId=<%=desc.getProblemId() %>">Download File</a>

Все расширения сохраняются / извлекаются в БД правильно. Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 30 декабря 2011

Вам необходимо установить правильные заголовки.Я устанавливаю эти заголовки для загрузки моего файла .xls и его работы.

response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-type", "application-download");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setHeader("Content-Transfer-Encoding", "binary");
0 голосов
/ 30 декабря 2011

    public class FileController extends AbstractFormController{
    SearchResultService searchResultService;

    public void setSearchResultService(SearchResultService searchResultService){
    this.searchResultService = searchResultService;
    }


    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    ResultSet result = searchResultService.getAttachment(Integer.parseInt(arg0.getParameter("prbId")));
    byte[] buff = new byte[100000];
    try {
    result.next();
    if(!(result.getBinaryStream(1)==null)){
    String filename = "fname."+result.getString("file_ext");
    if(result.getString("file_ext").equals("txt")){
    InputStream is = result.getBinaryStream(1);
    OutputStream out = arg1.getOutputStream();
    arg1.reset();
    int bytesRead;
    while ((bytesRead = is.read(buff)) != -1) {
    out.write(buff, 0, bytesRead);
    }
    response.setContentType("text/plain");
    arg1.setHeader("content-disposition", "attachment; filename="+filename);
    is.close();
    out.flush();
    out.close();
    }else{
    arg1.reset();
    if(result.getString("file_ext").equals("doc")||result.getString("file_ext").equals("docx")){
    arg1.setContentType("application/msword");
    }else if(result.getString("file_ext").equals("xls")||result.getString("file_ext").equals("xlsx")){
    arg1.setContentType("application/msexcel");
    }else if(result.getString("file_ext").equals("pdf")){
    arg1.setContentType("application/pdf");
    }
    arg1.setHeader("Content-Disposition","attachment; filename="+filename);
    byte[] bytesGot = result.getBytes(1);
    ServletOutputStream outs = arg1.getOutputStream();
    outs.write(bytesGot);
    outs.flush();
    outs.close();
    }
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return new ModelAndView();
    }
    }

0 голосов
/ 30 декабря 2011

Для пункта 2 - у вас есть орфографическая ошибка в настройке заголовка.

arg1.setHeader("Content-Desposition","attachment; filename="+filename);

Это должно быть Content-Disposition, а не Content-Desposition.

Для пункта 1 - попробуйте сбросить настройки браузера. См. эту ссылку для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...