2017-05-26 13 views
0

私は簡単なファイルアップローダを開発しています。単純なファイルアップローダーは、様々なファイルをアップロードすることになって追加されます(画像/ 、ビデオ/、オーディオ/ 、テキスト/およびアプリケーション/ ***)それぞれの画像、ビデオ、オーディオ、テキストおよびアプリケーションディレクトリへ。 @MultipathConfig(location = "/ files/uploads")注釈で指定されている現在のディレクトリにパス(例:video /)を追加する際に問題があります。私はアップロードされたビデオのパスを/files/uploads/video/aws_signs_javas_creator.mp4にします。 私はUbuntuのNetbeans 8.02、GlassFish Server 4.0で開発しています。@MultipartConfig(location = "/")への余分なパス情報の追加

index.jspを

<form method="POST" action="upload" enctype="multipart/form-data"> 
    <div> 
     <input type="file" id="file" name="file" multiple/> 
    </div> 
    <div> 
     <button type="submit" name="upload">Upload</button> 
    </div> 
</form> 

FileUploader.java

@WebServlet(name = "FileUploader", urlPatterns = {"/upload"}) 
@MultipartConfig(location = "/files/upload") 
public class FileUploadController extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList()); 
     InputStream fileContent = null; 
     String fileName = null; 
     String fileType = null; 
     for (Part filePart : fileParts) { 
      if (filePart.getSize() != 0) { 
       fileName = Decorator.getFileName(filePart); 
       fileType = filePart.getContentType(); 

       fileContent = filePart.getInputStream(); 
       filePart.write(location + fileName); 

       if(fileType.contains("image/")) { 
        filePart.write("/images/" + fileName); 
       } else if(fileType.contains("application/")) { 
        filePart.write("/applications/" + fileName); 
       } else if(fileType.contains("video/")) { 
        filePart.write("/videos/" + fileName); 
       } else if(fileType.contains("text/")) { 
        filePart.write("/texts/" + fileName); 
       } else if(fileType.contains("audio/")) { 
        filePart.write("/audios/" + fileName); 
       } 
      } 
     } 
    } 
    private String getFileName(final Part part) { 
     final String partHeader = part.getHeader("content-disposition"); 
     LOGGER.log(Level.INFO, "Part Header = {0}", partHeader); 
     for (String content : part.getHeader("content-disposition").split(";")){ 
      if (content.trim().startsWith("filename")) { 
       return content.substring(
         content.indexOf('=') + 1).trim().replace("\"", ""); 
      } 
     } 
     return null; 
    } 
} 

答えて

0

2つのエラーの原因:

あなたは/で始まるファイル名を渡します。たぶん、Glassfishは、それをアップロードディレクトリに相対的なものではなく、絶対的な場所に書き出します。サブディレクトリがまだ存在しない場合はそのため

filePart.write("images/" + fileName); 

など

を試し、一部の書き込みにも失敗することがあります。 (これはTomcatで起こります)。

どちらの場合も、サーバのログファイルには、何がうまくいかないのかのヒントが含まれていることが望まれます。

+0

ここに例外があります:java.io.FileNotFoundException:/home/nkengbeza/glassfish-4.1.1/glassfish/domains/domain1/generated/jsp/FilesUploader/files/uploads/images/jquery-logo.png(いいえそのようなファイルまたはディレクトリ)。アップロードパスを次のようにしたいとします:/home/nkengbeza/glassfish-4.1.1/glassfish/domains/domain1/iles/uploads/images/jquery-logo.png – byteHunt3r

+0

@ byteHunt3r Glassfishが指定したあなたの場所を無視しているようです'@ MultipathConfig'アノテーションを作成したり、書き込み位置に関するServlet仕様を誤って埋め込んでしまいます。この問題を回避するには、パートのInputStreamを使用して、面倒な 'Part.write(String)'に頼るのではなく、あなた自身を場所に書き込むことができます。 – wero

関連する問題