【问题标题】:java.io.FileNotFoundException (path)(Access is denied) when uploading file上传文件时java.io.FileNotFoundException(路径)(访问被拒绝)
【发布时间】:2017-10-26 08:26:07
【问题描述】:

我正在使用 jQuery 通过 AJAX 上传图像。

这是我的 HTML:

<body>
  <form id="formId">
    <input type="file" name="file">
    <input type="submit" id="btn" value="submit">
  </form>
</body>

这是我的 jQuery 代码:

$(document).ready(function(){ 
  $("#btn").ready(function(){ 
    data1= new FormData($("#formId")[0]);

    $.ajax( {
      url: 'Sample1',
      type: 'POST',
      data :data1,
      processData: false,
      contentType: false,
      dataType:"text",
      success:function(response)
      {  
      }
    }); 
  });
});  

这是我的 Java 代码:

ServletFileUpload sf=new ServletFileUpload(new DiskFileItemFactory());
try {
    List<FileItem> multifiles=sf.parseRequest(request);
    for(FileItem item:multifiles){
        try {
            item.write(new File("D:\\Projects\\i_seva\\WebContent\\"+item.getName()));
            System.out.println(item.getName());;
            //System.out.println(ss);
        } catch (Exception e) { 
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
} catch (FileUploadException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}  

当我点击按钮时,请求将发送到Sample1 servlet,但以下异常即将到来

java.io.FileNotFoundException: D:\Projects\i_seva\WebContent (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:394)
    at com.iseva.Servlet.Sample1.doPost(Sample1.java:35)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1519)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1475)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

如果我在没有 AJAX 的情况下执行此操作,仅使用正常的表单操作,它会上传图像。我无法追踪哪里出了问题。

【问题讨论】:

  • 你能把java代码也发一下吗?
  • 它与你的java代码“at com.iseva.Servlet.Sample1.doPost(Sample1.java:35)”有关。您始终可以在堆栈跟踪中找到信息。
  • 如果访问被拒绝,您可以查看stackoverflow.com/questions/12876743/…
  • 请检查我的java代码我已经添加了@Lio
  • 如果我这样做without ajax,只有form action 上传图片。

标签: java jquery ajax jquery-file-upload


【解决方案1】:

我认为当您尝试通过 ajax 时这不起作用的原因是代码在您的页面加载时立即运行,而无需等待用户选择图像或单击按钮。

如果你转到这个链接:http://jsfiddle.net/L7n7r9q9/ 并打开浏览器的网络选项卡,你可以看到页面一加载就发出了 ajax 请求。当按钮被点击时,它使用正常的表单动作来处理请求,因为没有 JavaScript / jQuery 代码来实际处理按钮的点击。

原因是这一行:

 $("#btn").ready(function() {

没有做你想做的事。 “ready”方法用于在页面加载且 DOM 准备好后立即执行功能。您将它附加到“btn”这一事实没有任何区别(即使它这样做了,它只会在按钮呈现后运行,这仍然是不正确的)。 jQuery 文档对此进行了说明:

...选择与 .ready() 方法的行为无关

更多详情请参阅https://api.jquery.com/ready/

这意味着上传代码运行时没有选择文件,因为用户没有时间选择一个。我认为这反过来意味着您的 Java 代码尝试保存到无意义/不存在的文件路径,因为在尝试将文件保存到磁盘之前,它似乎没有验证文件是否已实际上传。

你真正想做的是处理按钮的“点击”事件,它只在用户点击按钮时运行代码:

$(document).ready(function(){ 
  $("#btn").click(function(event){ //note "click" instead of "ready"
    event.preventDefault(); //stop default postback behaviour so we can use ajax
    var data1 = new FormData($("#formId")[0]);

    $.ajax( {
      url: 'Sample1',
      type: 'POST',
      data :data1,
      processData: false,
      contentType: false,
      dataType:"text",
      success:function(response)
      {  
      }
    }); 
  });
}); 

注意即使这不能完全解决拒绝访问的问题(您可能仍然没有权限,我无法验证),您当然需要在 ajax 上传开始工作之前像这样修改您的代码。

【讨论】:

    【解决方案2】:

    检查路径 D:\Projects\i_seva\WebContent 是否存在,网络服务器是否有权在此处写入文件,以及 item.getName() 到底是什么 - 如果为空,您将丢失文件名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多