2016-04-08 72 views
0

私はJavaサーブレットをローカルでテストしていますが、ここで何が起こっているのかわかりません。ファイルには、先に正しくアップロードされますが、ファイルが正しく書き込まれた後、私は、「アクセスが拒否されました」というエラーが表示されます:java.io.FileNotFoundException(アクセスが拒否されました)、ファイルは@ MultipartConfig(場所)とにかく書かれています

Apr 08, 2016 10:12:39 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [FileUploadServlet] in context with path [/FileUpload] threw exception 
java.io.IOException: java.io.FileNotFoundException: C:\temp (Access is denied) 
at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:121) 
at FileUploadServlet.doPost(FileUploadServlet.java:63) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.FileNotFoundException: C:\temp (Access is denied) 
at java.io.FileOutputStream.open(Native Method) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:171) 
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.write(DiskFileItem.java:402) 
at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:119) 
... 22 more 

サーブレットコード:

/** 
* Servlet implementation class FileUploadServlet 
*/ 
@WebServlet(asyncSupported = true, urlPatterns = { "/FileUploadServlet" }) 
@MultipartConfig(location="c:/temp/temp") 

public class FileUploadServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

/** 
* Default constructor. 
*/ 
public FileUploadServlet() { 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    PrintWriter out = response. getWriter(); 

    out.print("<!DOCTYPE html>"); 
    out.println("<head><title>File Upload</title><meta http-equiv='Content-Type' content='text/html charset=UTF-8'>"); 
    out.println("</head><body><form method='POST' action='./FileUploadServlet' enctype='multipart/form-data' >"); 
    out.println("File:<input type='file' name='file' id='file' /> <br/>"); 
    out.println("Destination:<input type='text' value='/tmp' name='destination'/>"); 
    out.println("</br><input type='submit' value='Upload' name='upload' id='upload' />"); 
    out.println("</form></body></html>"); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    for (Part part : request.getParts()) { 
     String fileName = extractFileName(part); 
     File f = new File(fileName); 
     part.write("C:" + File.separator + "temp" + File.separator + f.getName()); 
    } 
} 

/** 
* Extracts file name from HTTP header content-disposition 
*/ 
private String extractFileName(Part part) { 
    String contentDisp = part.getHeader("content-disposition"); 
    String[] items = contentDisp.split(";"); 
    for (String s : items) { 
     if (s.trim().startsWith("filename")) { 
      return s.substring(s.indexOf("=") + 2, s.length()-1); 
     } 
    } 
    return ""; 
} 
} 

編集:行が与える問題でトレースは

part.write("C:" + File.separator + "temp" + File.separator + f.getName()); 

EDIT 2:最終的には(ファイルが送信されたものの一部であるように見える)EDIT 2です。コード:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    File uploads = new File("C:/temp"); 
    Part filePart = request.getPart("file"); 
    String fileName = extractFileName(filePart); 
    File f = new File(fileName); 
    File file = new File(uploads, f.getName()); 
    try (InputStream input = filePart.getInputStream()) { 
     Files.copy(input, file.toPath()); 
    } catch (Exception e){ 
     response.setContentType("text/html"); 
     PrintWriter out = response. getWriter(); 
     out.print("<body>Failed to upload file <br>" + e.getMessage()); 
    } 
} 
+1

ファイルが正しくアップロードされていると思いますか? – Raedwald

+0

フォーム上のアップロードをクリックしたあと、目的のフォルダにあるファイルが表示されますが、これはあまり経験はありませんが、ローカルで作業しても何もしなければファイルがアップロードされています – Aridez

+0

@Raedwald: '@ MultipartConfig' 。 OPは 'part.write()'を誤解しましたが(そのAPIメソッドは間違った名前を選んでいます)、そのドキュメントによれば "ファイルを別のパス/名前**相対**に変更して現在の@Multpartpart(場所) "、例えば'part.write(" finalname.ext ");'または 'part.write("サブフォルダ/ finalname.ext ")'です。 Aridez、試してみて、それが本当にそれを解決すれば、私たちに知らせてください。まだ無駄な場合は、http://stackoverflow.com/q/18664579にご連絡ください – BalusC

答えて

0

SEVERE:のServlet.service()パスに関連してサーブレット[FileUploadServlet]を[/するFileUpload]は例外 にjava.io.IOException投げ:java.io.FileNotFoundException:C:\のTEMPを(アクセスが拒否されました)

これは、このJavaデプロイメントを実行したユーザー(この場合は、アプリケーションサーバーを実行しているユーザー)に、そのフォルダにアクセスする権限がないことを示しています。回避策は、ファイルを実行するユーザーによって作成されたフォルダーにファイルを配置するか、フォルダーに対応するアクセス許可を付与することです。

+0

ファイルが宛先に正しく書き込まれています。これは私がこれについて奇妙に感じるものです。また、私はプログラムを実行している人で、そのフォルダにファイルを作成する権限があります。私はこれがこの場合の問題だとは思わない。 – Aridez

関連する問題