web-dev-qa-db-ja.com

FileNotFoundException(ディレクトリです)

現在、複数のファイルをアップロードしようとしていますが、ファイルは宛先ディレクトリに正しくアップロードされています。しかし、ログでは次のエラーが発生しています。

Java.io.FileNotFoundException: /home/sandeep/Java_proj/jee_tut/files (Is a directory)

at Java.io.FileOutputStream.open(Native Method)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:221)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:171)
at com.jee.controller.FileProcessing.uploadFiles(FileProcessing.Java:35)
at com.jee.controller.View.doPost(View.Java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:727)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:303)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:208)
at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:241)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:208)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:220)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:122)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:501)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:950)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:116)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1040)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:607)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:314)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
at Java.lang.Thread.run(Thread.Java:745)

これは、ファイルをアップロードするための私のコードです。

final String UPLOAD_DIR="files";

    String applicationPath="/home/sandeep/Java_proj/jee_tut";
    String uploadDirPath= applicationPath + File.separator + UPLOAD_DIR;

    try{
        File fileDir=new File(uploadDirPath);
        if(!fileDir.exists()){
            fileDir.mkdirs();
        }
        InputStream inputStream= null;
        OutputStream outputStream = null;
        try{
            for(Part part:request.getParts()){
                String fileName=getFileName(part);

                    File outputPath=new File(uploadDirPath + File.separator + fileName);
                    inputStream = part.getInputStream();
                    outputStream = new FileOutputStream(outputPath);

                    int read = 0;
                    final byte[] bytes = new byte[1024];
                    while((read=inputStream.read(bytes)) != -1){
                        outputStream.write(bytes, 0, read);
                    }
                System.out.println(fileName);
            }
        }catch(Exception e){
            e.printStackTrace();
            return "";
        }
        finally{
            if(inputStream != null){
                inputStream.close();
            }
            if(outputStream != null){
                outputStream.close();
            }
        }
        return uploadDirPath;

    }catch(Exception e){
        e.printStackTrace();
        return "";
    }

私はJavaを初めて使用するため、なぜこのエラーが発生するのかわかりません。これをデバッグするにはどうすればよいですか?

9
Sandeep Rao

場合によっては、filenameが空白またはnullのように見えるため、File outputPath=new File(uploadDirPath + File.separator + fileName);はディレクトリになり、ここではnew FileOutputStream(outputPath);をファイルではなくディレクトリに書き込もうとします。したがって、filenameが空白でないかどうかを確認する必要があります。

11
Jens

コードに多くのエラーがあります。 1つは、lastInputStreamsとOutputStreamsのみを閉じることです。それぞれを閉じる必要があります。ここでのやり方では、リソースリークが発生します。

第二に、これは2015年です。したがって、Fileを削除し、代わりにJava.nio.fileを使用してください。さらに、try-with-resourcesを使用します。

3番目:今、プロジェクトディレクトリにアップロードします。アプリケーションがサーバー上で「ライブ」で実行されている場合は、これを行わないでください。これは明らかに機能しません。

サンプル:

private static final Path BASEDIR = Paths.get("/path/to/upload/directory");

// in the upload method:

Files.createDirectories(BASEDIR);

String fileName;
Path path;

for (final Part part: request.getParts()) {
    fileName = getFileName(part);

    if (fileName.isEmpty())
        continue;

    path = BASEDIR.resolve(fileName);

    try (
        final InputStream in = part.getInputStream();
    ) {
        Files.copy(in, path, StandardOpenOption.CREATE_NEW);
    }
}
5
fge

このエラーは、完全なfileNameでfile.mkdirs()を使用していたために発生しました。

ファイルパスが_emulated/0/test/images/img.jpg_であるとします。

次に、パスから最後の部分を削除し、結果ファイルでfile.mkdirs()を使用します

_File file=new File("emulated/0/test/images/")
  if(!file.exists()){
       file.mkdirs();
   }
_
3
Manohar Reddy