Файл не найден при просмотре - PullRequest
1 голос
/ 12 января 2010

У меня есть одна проблема, чтобы загрузить файл. Он отлично работает на моем компьютере, но не удается выполнить развертывание на сервере.

Система должна просмотреть файл, затем система заархивирует его перед загрузкой на сервер. Когда клиент просматривает файл, сервер выдаст ошибку, что файл не найден. Вот мой код:

  try {
      //This is a code to read a zipfile.
      String dir = request.getParameter("dirs");
      System.out.println(dir);
      String tmp = dir.replace( '\\', '/' );
      System.out.println(tmp);
      String inFilename = tmp;
      // String inFilename = dir;
      String outFilename = "c:/sms.zip";
      //String outFilename = "/webapps/ROOT/sms.zip";
      FileInputStream in = new FileInputStream( inFilename);
      ZipOutputStream out = new ZipOutputStream(
          new FileOutputStream(outFilename));

      // Add ZIP entry to output stream.
      out.putNextEntry(new ZipEntry(inFilename));

      byte[] buf = new byte[1024];
      int len;

      while ((len = in.read(buf)) > 0) {
          out.write(buf, 0, len);
      }
      //End of zipping file.

      //Start uploading.
      SimpleFTP ftp = new SimpleFTP();

      // Connect to an FTP server on port 21.
      ftp.connect("xxxxx", 21, "xxx", "xxxx");

      // Set binary mode.
      ftp.bin();

      // Change to a new working directory on the FTP server.
      ftp.cwd("web");

      // Upload some files.
      ftp.stor(new File("sms.zip"));

      ftp.disconnect();
      //finish uploading
      out.closeEntry();
      out.close();
      in.close();
      response.sendRedirect("../BakMeClient/success.jsp");
  } 
  catch (IOException e) {
      System.out.println(e);
  }

String dir - местоположение файла. Сообщение об ошибке:

java.io.FileNotFoundException: D: \ RELIVA \ listmenu.java (система не может найти указанный файл)


Спасибо за все ваши комментарии. По моим наблюдениям, проблема в том, что этот скрипт запускается на сервере, а не на клиенте.

Я имею в виду, например, что вы просматриваете файл, например, по адресу c: /test.txt. Когда вы нажимаете кнопку загрузки, форма отправляет путь на сервер, а сервер находит путь в своем собственном каталоге и, конечно, не находит его.

Надеюсь, вы поняли, что случилось. Итак, теперь: как заставить его прочитать путь у клиента?

Ответы [ 4 ]

3 голосов
/ 12 января 2010

Вот определенно проблема:

// Upload some files.
ftp.stor(new File("sms.zip"));

Архив создан в c:/sms.zip, но вы пытаетесь прочитать его из относительного местоположения файла sms.zip (, что равно ${JAVA_HOME}/sms.zip, если я правильно помню Правильная часть в комментарии Иоахима, спасибо !! ).

Заменить эти строки на

// Upload some files.
ftp.stor(new File("c:/sms.zip"));

Если это не помогает, попробуйте закрыть ZipOutputStream перед отправкой файла с FTP. Существует вероятность того, что файл ZIP еще не был создан в файловой системе только потому, что поток все еще открыт.

2 голосов
/ 13 января 2010

Здесь есть серьезное недоразумение. Вы отправляете пути к локальной файловой системе вместо фактического содержимого файла . Представьте, что я клиент, и у меня есть файл на c:/passwords.txt, и я указываю вам путь. Как бы вы, будучи сервером, могли получить его содержимое?

С new FileInputStream("c:/passwords.txt")? Нет, к счастью, не произойдет. Он будет работать только тогда, когда клиент и сервер будут работать на физически одинаковой машине, как вы узнали.

Загрузка файлов с использованием HTML (независимо от того, находится ли он внутри файла JSP) должна выполняться с помощью поля <input type="file"> следующим образом:

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>

Таким образом, файл будет отправлен в теле запроса. Поскольку стандартные версии API сервлетов до 2.5 не поддерживают запросы mulipart/form-data, вам необходимо проанализировать запрос самостоятельно. Для этого лучше всего использовать Apache Commons FileUpload . Перейдите по ссылке и прочитайте Руководство пользователя и Часто задаваемые вопросы , где приведены примеры кода, советы и рекомендации. Если вы уже используете Servlet 3.0, вы можете просто использовать для этого Servlet API, предоставленный HttpServletRequest#getParts(). Здесь вы можете найти статью с примерами кода об этом .

Если вы действительно хотите загрузить полную папку с файлами на серверную часть и вы не хотите использовать для этого несколько полей <input type="file">, тогда вам понадобится Applet или SWF для этого, потому что это невозможно с простым ванильным HTML. На стороне сервера вы можете точно так же проанализировать запрос.

0 голосов
/ 12 января 2010

Я думаю, если он работает в вашей системе, а не на сервере, должна быть проблема с настройками сервера.

Или вы можете проверить следующие вещи

  1. Необходимо проверить путь, над которым вы работаете.

  2. Перед загрузкой попробуйте перечислить файлы в этом каталоге после создания ZIP-файла.

  3. Проверка прав доступа.

0 голосов
/ 12 января 2010

Ваш outFilename должен быть найден в Интернете. Как: "http://www.sample.com/sms.zip" или лайки ..

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