浏览时找不到文件

时间:2010-01-12 09:14:03

标签: java jsp servlets file-upload

我有一个问题就是上传文件。它在我的计算机上运行良好,但在部署到服务器时失败。

系统将浏览文件,然后系统会在将其上传到服务器之前将其压缩。当客户端浏览文件时,服务器将生成错误,指出找不到该文件。这是我的代码:

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

字符串dir是文件的位置。 错误消息是:

  

java.io.FileNotFoundException:D:\ RELIVA \ listmenu.java(系统找不到指定的文件)


感谢您的所有评论。根据我的观察,问题是这个脚本是在不在客户端上的服务器上运行的。

我的意思是让你说你在c:/test.txt浏览文件。当您单击上传按钮时,表单将发送到服务器的路径,服务器将在其自己的目录中找到路径,当然它将找不到它。

我希望你知道发生了什么。现在:如何让它在客户端读取路径?

4 个答案:

答案 0 :(得分:3)

这绝对是个问题:

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

存档已在c:/sms.zip创建,但您尝试从相对文件位置sms.zip读取它(如果我没记错的话,等于${JAVA_HOME}/sms.zip 正确的部分是Joachim的评论,谢谢!! )。

替换这些行
// Upload some files.
ftp.stor(new File("c:/sms.zip"));

如果这没有帮助,那么另外在使用FTP发送文件之前尝试关闭ZipOutputStream。由于流仍处于打开状态,因此有可能尚未在文件系统上创建ZIP文件。

答案 1 :(得分:2)

这里有一个重大的误解。您正在发送本地磁盘文件系统路径而不是实际文件内容。想象一下,我是客户,我在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>

这样,文件将在请求正文中发送。由于标准版本的Servlet API版本不支持mulipart/form-data请求,因此您需要自己解析请求。最好的方法是使用Apache Commons FileUpload。请点击链接,阅读用户指南常见问题解答,了解代码示例和提示及技巧。如果您已经使用Servlet 3.0,那么您可以使用为此提供的Servlet API HttpServletRequest#getParts()You can find here an article with code examples about that

如果您确实要将包含文件的完整文件夹上传到服务器端,并且您不想为此使用多个<input type="file">字段,那么您需要{{ 3}}或Applet为此,因为普通的HTML不可能实现这一点。在服务器端,您可以以相同的方式解析请求。

答案 2 :(得分:0)

我认为,如果它在您的系统中而不是在服务器中工作,则服务器设置一定存在问题。

或者您可以查看以下内容

  1. 需要检查您正在处理的路径。

  2. 在上传之前,请在生成ZIP文件后尝试列出该目录中的文件。

  3. 检查权限。

答案 3 :(得分:-1)

必须在网络中找到您的outFilename。喜欢:“http://www.sample.com/sms.zip”或类似的......