GWT:获取位于服务器上的文件的URL

时间:2012-02-05 14:59:27

标签: file gwt download

我正在开发一个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目录中显示存储在服务器上的文件?

  • 我的glassfish服务器临时目录路径:C:\ Program Files(x86)\ glassfish-3.1 \ glassfish \ domains \ domain1 \ TEMP \ example.pdf
  • 部署应用网址时的行为如下:http://localhost:8080/AppName/
  • 我试过类似的东西:Window.open(“http:// localhost:8080 / AppName / TEMP / example.pdf”,“_ blank”,“enabled”)

我的代码: 客户方:

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)

1 个答案:

答案 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来下载文件。