GWT: Получить URL файла, расположенного на сервере - PullRequest
1 голос
/ 05 февраля 2012

Я разрабатываю веб-приложение, которое может загружать / скачивать файл с клиента на сервер базы данных PostgreSQL с помощью вызова RPC GWT.

Мне удалось создать сервлет загрузки, в котором хранится нужный файл (выбирается пользователем с помощью FileUploadwidget) в каталог «TEMP» Glassfish => затем я использовал команду SQL:

INSERT INTO table VALUES ('"+name+"',lo_import('"+f.getCanonicalPath()+"\\TEMP\\"+name+"'),...) 

, которая поместила этот файл в базу данных.Это работает довольно хорошо.

Проблема возникает, когда я хочу загрузить файл с сервера на клиент.Сначала мне нужно поместить файл обратно в каталог TEMP с помощью команды SQL lo_export (...) -> это не сработало (ошибка при создании файла сервера, разрешение запрещено), поэтому я поместил файл вручную в каталог TEMP.

Вопрос в том, как я могу отобразить этот файл, который хранится на сервере, в директории TEMP?

  • Мой путь к директории сервера Glassfish: C: \ Program Files (x86) \ glassfish-3.1 \ glassfish \ domains \ domain1 \ TEMP \ example.pdf
  • при развертывании URL-адреса приложения выглядит следующим образом: 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");

, поэтому я передаю сервлету, расположенному на стороне сервера, ссылку и имя файла ...я прав?

Сторона сервера:

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();

Когда я нажимаю файл в виджете «Дерево», он показывает мне новое окно браузера с этой ошибкой:

java.io.FileNotFoundException: TEMP\null (The system cannot find the file specified)

1 Ответ

3 голосов
/ 06 февраля 2012

Вы не можете скачать файл с вызовом RPC. Вы должны использовать обычный сервлет Java. Вы должны записать байты в HttpServletResponse. Вы можете получить байты из файла в базе данных, выполнив запрос SQL.

Этот пример сделан с пружиной 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, чтобы загрузить файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...