2017-10-26 3 views
0

jQueryを使用してAJAX経由で画像をアップロードしています。ここでファイルをアップロードするときにjava.io.FileNotFoundException(パス)(アクセスが拒否されました)

は私の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サーブレットに移動しますが、次の例外が発生しています

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なしでそれを行うと、通常のフォーム操作でのみ、画像をアップロードしています。私はそれが間違っている場所を辿ることができません。

+1

あなたもJavaコードを投稿できますか? – Lino

+0

これはJavaコード "_at com.iseva.Servlet.Sample1.doPost(Sample1.java:35)_"に関連しています。スタックトレースでは常に情報を見つけることができます。 – Alex

+0

アクセスが拒否された場合は、https://stackoverflow.com/questions/12876743/creating-file-on-windows-7-causes-access-denied-exceptionをチェックしてください。 – Alex

答えて

0

私はajax経由で試してみるとうまくいかない理由は、画像を選択したりボタンをクリックするのを待つことなく、ページが読み込まれたときにすぐにコードが実行されているからです。

このリンクにアクセスして:http://jsfiddle.net/L7n7r9q9/を開いてブラウザのネットワークタブを開くと、ページが読み込まれるとすぐにajaxリクエストが行われることがわかります。ボタンをクリックすると、ボタンのクリックを実際に処理するJavaScript/jQueryコードがないため、通常のフォームアクションを使用してリクエストを処理します。

この理由は、この行されていること:

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

はあなたが意図し何をしていません。 「準備完了」メソッドは、ページがロードされ、DOMが準備が整うとすぐに関数を実行するために使用されます。あなたが "btn"にアタッチしたという事実は、何の違いもありません(そして、そうであっても、ボタンがレンダリングされた時点で実行されますが、まだ正しくはありません)。 jQueryのドキュメントは、この上で述べている:

...選択は

は詳細についてhttps://api.jquery.com/ready/を参照してください.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) 
     { 
     } 
    }); 
    }); 
}); 

N.B.アクセス拒否の問題を完全に解決していない場合でも(まだアクセス権がなく、それを検証できない場合もあります)、Ajaxのアップロードを開始する前に、このようなコードを修正する必要があります。

+1

ありがとうございます@ADyson – raj

0

Webサーバーにファイルを書き込む権限があるかどうか、さらに正確にはitem.getName()となっているかどうかを確認します。空白の場合はファイル名がありません。

関連する問題