我正在开发一个Web应用程序,可以通过GWT RPC调用将文件从客户端上载/下载到PostgreSQL数据库服务器。
我设法创建了一个上传servlet,它将所需的文件(由用户通过FileUpload小部件选择)存储到Glassfish“TEMP”目录=>然后我用了SQL命令:
INSERT INTO table VALUES ('"+name+"',lo_import('"+f.getCanonicalPath()+"\\TEMP\\"+name+"'),...)
将该文件放入数据库。这非常好。
当我想从服务器下载文件到客户端时出现问题。首先,我需要使用SQL命令lo_export(...) - >将文件放回TEMP目录。这不起作用(创建服务器文件时出现一些错误,权限被拒绝),所以我手动将文件放到TEMP目录。
问题是如何在TEMP目录中显示存储在服务器上的文件?
http://localhost:8080/AppName/
我的代码: 客户方:
String link = GWT.getModuleBaseURL() + "filedownloadservlet";
Window.open(link,event.getSelectedItem().getText(),"enabled");
所以我将位于服务器端的servlet传递给链接和文件名......我是对的吗?
服务器端:
public class FileDownloadServlet extends HttpServlet {
private String path = "TEMP//"; // Your absolute path
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");
System.out.println(filename); // THIS IS NULL value
File userManualFile = new File(path + filename);
// You can fetch a Blob from the database instead.
ServletOutputStream servletOutputStream = resp.getOutputStream();
resp.setContentType("application/pdf");
resp.addHeader("content-disposition", "attachment; filename=skuska.pdf");
FileInputStream fileInputStream = new FileInputStream(userManualFile);
IOUtils.copy(fileInputStream, servletOutputStream);
servletOutputStream.flush();
当我按下Tree小部件中的文件时,它会显示一个新的浏览器窗口,显示以下错误:
java.io.FileNotFoundException: TEMP\null (The system cannot find the file specified)
答案 0 :(得分:3)
您无法使用RPC调用下载文件。您必须使用普通的java servlet。您必须将字节写入HttpServletResponse。您可以通过执行SQL查询从数据库中的文件中获取字节。
这个例子是用spring MVC完成的。
@Controller
public class UserManualServlet {
private String path = "..." // Your absolute path
@RequestMapping("/app/usermanual.download")
public void generateInterceptActivationDeactivationReport(HttpServletRequest request, HttpServletResponse response)
throws IOException
{
String filename = request.getParameter("filename");
File userManualFile = new File(path + filename);
// You can fetch a Blob from the database instead.
ServletOutputStream servletOutputStream = response.getOutputStream();
response.setContentType("application/pdf");
response.addHeader("content-disposition", "attachment; filename=\"user-manual.pdf\"");
FileInputStream fileInputStream = new FileInputStream(userManualFile);
IOUtils.copy(fileInputStream, servletOutputStream);
servletOutputStream.flush();
}
在此示例中,您可以调用URL:.. / app / usermanual.download?filename = usermanual.pdf来下载文件。