【问题标题】:File not found when browsing浏览时找不到文件
【发布时间】:2011-01-04 02:29:33
【问题描述】:

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

系统正在浏览文件,然后系统将其压缩后再上传到服务器。当客户端浏览文件时,服务器会产生文件未找到的错误。这是我的代码:

  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(系统找不到指定的文件)


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

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

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

【问题讨论】:

    标签: java jsp servlets file-upload


    【解决方案1】:

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

    【讨论】:

    • 我的问题不是输出而是输入..它找不到已经浏览过的文件
    【解决方案2】:

    这里肯定有问题:

    // 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 文件尚未在文件系统上创建。

    【讨论】:

    • 它与$JAVA_HOME 无关(事实上,Java 本身从未读取过该变量)。它是相对于当前工作目录的,可以通过系统属性user.dir读取(但不能更改)。
    • 感谢您的评论..我的主要问题是在第一行没有找到浏览文件,即使文件在那里
    【解决方案3】:

    我认为,如果它在您的系统中而不是在服务器中运行,那么服务器设置肯定有问题。

    或者您可以检查以下内容

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

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

    3. 检查权限。

    【讨论】:

      【解决方案4】:

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

      这样文件将在请求正文中发送。由于 2.5 之前的标准 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.

      如果您确实想将包含文件的完整文件夹上传到服务器端,并且您不想为此使用多个&lt;input type="file"&gt; 字段,那么您需要AppletSWF 对此,因为这对于普通的 HTML 是不可能的。在服务器端,您可以以同样的方式解析请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 2014-04-08
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 2017-05-23
        相关资源
        最近更新 更多