JSP - 允许用户从服务器下载文件

时间:2014-12-14 22:52:53

标签: java html jsp

我在Java / JSP中编写了一个程序,它根据用户输入动态创建一个CSV文件并存储它(在服务器上)。

如何允许用户下载此文件?

目前使用以下内容来确定存储文件的路径。

String csv2 = "D:\\erp\\Dispatch\\DC_" + (df.format(date)).toString() + "_Print.csv";
CSVWriter writer2 = new CSVWriter(new FileWriter(csv2));

根据我的研究,最好的办法是将它存储在web目录中,并提供文件的相对路径。在这种情况下,我应该在哪里存储文件(或者我应该如何将它存储到web目录中)?

注意:上面的路径是在JSP中设置的,因此我可以使用相同的变量来提供用户的URL /路径

注意2:服务器是tomcat服务器

2 个答案:

答案 0 :(得分:5)

您可以创建一个文件并且不将其存储在服务器上 - 立即将其作为可下载文件返回给客户端。

这样做的好处是,除非经常清理,否则您的服务器上不需要临时存储可能会增长并保持增长。

当然,如果您希望创建旧CSV文件的“存档”作为服务给您的客户,那么这不是真正的优势。但大多数情况下,“创建/提供下载/丢弃”是更有趣的方法。

这里有一些示例代码可以给你一些想法:

1)servlet(注意:异常处理未显示)

public class CsvDownloadServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
    // fetch parameters from HTTP request

    String param = (String)request.getParameter("p");
    if (param == null)
    {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Parameter p missing");
        return;
    }

    .... perhaps fetch more parameters ....

    .... build your CSV, using the parameter values ....

    String result = .... // suppose result is your generated CSV contents
    String filename = .... // choose a file name that your browser will suggest when saving the download

    // prepare writing the result to the client as a "downloadable" file

    response.setContentType("text/csv");
    response.setHeader("Content-disposition", "attachment; filename=\""+filename+"\"");
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Expires", "-1");

    // actually send result bytes
    response.getOutputStream().write(result.getBytes());
}
}

2)WEB-INF / web.xml中的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"> 
     ....
    <servlet>
        <display-name>download</display-name>
        <servlet-name>download</servlet-name>
        <servlet-class>com.mypackage.CsvDownloadServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>download</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>
    ....
</web-app>

3)页面上的链接触发下载:

<a href="/myapp/download?p=myparamvalue">Click Here</a>

此处,/myapp是您的应用的“上下文根”,/downloadweb.xml中配置为触发CsvDownloadServlet代码的位置。 p是一个示例参数(请参阅servlet代码)。 如果您有一个用户填写参数值的表单,它可能如下所示:

 <form method='GET' action='/myapp/download'>
    Enter a value for parameter "p":
    <input id="p" type="text" size="10" name="p">
    <input type="submit" value="Generate and Download">
 </form>

这与前一个<a>链接具有相同的效果,只有参数是用户提供的。一旦用户单击提交按钮,将调用servlet代码并开始CSV生成和后续下载。 同样,未显示用户输入检查。

答案 1 :(得分:-4)

使用此代码:

<a href="path for the file" download="filename with extension"><u>Download</u></a>