FileNotFoundException (un Répertoire)
Je suis en train d'essayer de télécharger plusieurs fichiers et les fichiers sont en cours d'upload correctement dans le répertoire de destination. Mais dans les logs il me donne cette erreur:
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)
C'est mon code pour télécharger les fichiers:
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 "";
}
Comme je suis nouveau sur le java, je ne sais pas pourquoi il me donne cette erreur.
Comment corriger cela?
- Sur la ligne 35 de
FileProcessing.java
vous tentez d'ouvrir unFileOutputStream
à un répertoire. Vous ne pouvez pas le faire. - Aucune raison pourquoi vous utilisez java.io.Fichier en 2015? Si Java 7+, l'utilisation de java.nio.fichier à la place.
- Merci pour le heads up. Je vais commencer à l'aide de Java 7+
- Regarde ma réponse pour un échantillon; en particulier, vous fuite de ressources qui est une mauvaise chose.
Vous devez vous connecter pour publier un commentaire.
Ressemble dans certains cas
filename
est vide ou null siFile outputPath=new File(uploadDirPath + File.separator + fileName);
sera un répertoire et icinew FileOutputStream(outputPath);
vous essayez d'écrire dans un répertoire non à un fichier. Donc, vous devriez vérifier sifilename
n'est pas vide.Vous avez beaucoup d'erreurs dans votre code. Pour un, vous ne refermez pas la dernier
InputStream
s etOutputStream
s; vous devez fermer chacun d'eux. La façon dont vous faites les choses ici, vous avez une fuite de ressources.La seconde, c'est à 2015; donc diminuer
File
et l'utilisation de java.nio.fichier au lieu; de plus, l'utilisation de try-with-resources.Troisième: maintenant, vous avez télécharger dans le répertoire du projet; ne pas le faire lorsque l'application s'exécute en "live" sur un serveur, de toute évidence, cela ne fonctionnera pas.
Exemple:
Cette erreur s'est produite pour moi parce que j'ai été en utilisant
file.mkdirs()
avec le nom de fichier complet .Supposons que votre chemin d'accès au fichier est
emulated/0/test/images/img.jpg
Puis supprimer la dernière partie du chemin d'accès et à l'utilisation
file.mkdirs()
sur le fichier de résultat