我在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服务器
答案 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
是您的应用的“上下文根”,/download
在web.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>