写入文件并下载与附件相同的文件

时间:2014-07-08 15:56:32

标签: java jsp spring-mvc

我有一个要求,我从数据库中获取字节数组(byte [])数据,我需要将这些数据保存在文件中,并允许用户保存他想要保存的位置,就像下载附件一样。我正在从数据库中检索文件名和扩展名。我正在使用java,spring-mvc。 以下是代码:

弹簧控制器:

  @RequestMapping(value="/getFile", method = RequestMethod.GET)
        public ModelAndView getFile(HttpServletRequest request, HttpServletResponse response) {

             ModelAndView mav = new ModelAndView();
             //logic to get the data from database

           byte[] documentData =  document.getDOCUMENTData();

               String documentName =  document.getDOCUMENTTITLE();

        String documentExt = document.getDocumentExtension();

}

请建议,我知道使用java.io. *,我可以在文件中写入byte []数据并通过获取上面声明的值来给出文件名和扩展名,但是如何在点击“下载”时允许用户文件“用于写入数据的图标,并将该文件保存在他想要的相同位置下载附件。请建议。一旦用户点击下载文件图标控件来到上面的控制器。谢谢。

- EDIT--  修改后的代码:

@RequestMapping(value="/getFile", method = RequestMethod.GET)
        public ModelAndView getFile(HttpServletRequest request, HttpServletResponse response) {

             ModelAndView mav = new ModelAndView();
             //logic to get the data from database

           byte[] documentData =  document.getDOCUMENTData();

               String documentName =  document.getDOCUMENTTITLE();

        String documentExt = document.getDocumentExtension();
    response.setHeader("Content-Disposition", "attachment;filename="+userDoc.getDOCUMENT_TITLE());  
        long l =  userDoc.getDOCUMENT_SIZE();
        int size = (int)l;
        response.setContentLength(size);  
       response.getWriter().write("hello");//i need to write byte[] but for test i kept string.

}

我希望用户看到保存窗口,以便他可以保存他想要的任何地方从邮件下载附件。谢谢。

2 个答案:

答案 0 :(得分:0)

这是我用于同一请求的代码

HTML页面

<h:commandButton value="Click Here to Download" action="#{reportBean.download}" />

<强> BEAN:

public void download(){
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  

    response.setHeader("Content-Disposition", "attachment;filename="+file.getName());  
    response.setContentLength((int) file.length());  
    ServletOutputStream out = null;  
    try {  
        FileInputStream input = new FileInputStream(file);  
        byte[] buffer = new byte[1024];  
        out = response.getOutputStream();  
        int i = 0;  
        while ((i = input.read(buffer)) != -1) {  
            out.write(buffer);  
            out.flush();  
        }  
        FacesContext.getCurrentInstance().getResponseComplete();
        input.close();
    } catch (IOException err) {  
        err.printStackTrace();  
    } finally {  
        try {  
            if (out != null) {  
                out.close();  
            }  
        } catch (IOException err) {  
            err.printStackTrace();  
        }  
    } 
}

确保您拥有名为file

的File对象

答案 1 :(得分:-1)

您有两种方法可以实现这一目标:

一种方法是将文件写入服务器的本地文件系统中的Internet可访问文件夹中。您可以在Apache / IIS serttings中配置可从Internet访问哪些服务器的本地文件夹。然后,您更新HTML,以便“下载文件”链接通过URL指向该文件。

另一个选项是,像@ an3sarmiento一样,将文件作为byte []流返回给浏览器。要使此选项起作用,您必须与文件内容一起发送响应标头,在该响应标头中,您告诉浏览器您将可下载的文件作为流返回。您可以使用以下行:

response.setHeader("Content-Disposition", "attachment;filename="+[your file name]);
response.setContentLength([your file's length or bytes count]);
response.getWriter.write([your file's content as byte array]);

在上面的行中,我假设您正在使用Java Servlets,并且您有一个名为HttpServletResponse的{​​{1}}变量,您将响应浏览器的HTTP POST或GET请求。