2011-12-30 60 views
1

像我有我正在转换为byte[]并保存在数据库中,而在该文件中有UI文件链接的用户点击下载,下载我写了一个方法字节[]为下载

一个图像文件
public void downloadDeclarationForm(HttpServletRequest request, 
             HttpServletResponse response) throws IOException { 
    int payrollId = RequestUtils.getBrowsePayroll(request); 
    Payroll payroll = itConfigManager.getObjectOrNull(Payroll.class, payrollId); 
    int year = payrollManager.getYear(payroll.getFromDate()); 
    int id = NumberUtils.toInt(request.getParameter("id")); 
    try { 
     byte[] byteBuf = itConfigManager.getDeclarationFormBytes(id, year); 
     ControllerUtils.writeFileUploadHeaders(response, 
           itConfigManager.getFileName(id, year), byteBuf.length); 
     //response.setContentType("image/jpeg"); 
     OutputStream stream = new ByteArrayOutputStream(); 

     response.getOutputStream().write(byteBuf); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response.getOutputStream().print(
       "Error while fetching attachment.."); 
    } finally { 
     response.getOutputStream().close(); 

    } 

} 

,而我的下载链接,点击它打开下载窗口,甚至在该窗口中的文件名来正确与正确的扩展名,但它不是打开该文件,如果我保存该文件保存到磁盘,然后尝试打开它不开放谁能帮我 ?

回答

2

你必须设置响应头 - 内容类型,Conent,长度和内容处置。

例如,

response.setContentType("application octet-stream"); 
response.setHeader("Content-Length",String.valueOf(byteBuf.length)); 
response.setHeader("Content-Disposition", "attachment; filename=sample.png"); 
2

的setContentType应该取消注释和参数应该是正确的。例如,类型是'gif',它应该是response.setContentType("image/gif");。您需要确保您在那里设置了正确的图像类型。

如果你不知道你做了什么文件类型,你可以使用的ImageIO类。这里是关于ImageIO的讨论。 How to use ImageIO to get image type and image byte array