2017-01-02 9 views
2

添付ファイルを処理できる単純なjavamailアプリケーションを作成しようとしていますが、メールを送信するたびに「java.io.FileNotFoundException:fileName」が表示されます。アップロードしたファイルのアップロードに問題はありませんが、アップロードしたファイルの絶対パスを抽出できません.HTMLフォームを使用してマルチパートのフォームデータを送信しています。以下、それについての私のJavaコードで考える:JavaMail Appでアップロードしたファイルの絶対パスを見つけることができません

[編集] MailApp.java:

@WebServlet("/EmailSendingServlet") 
@MultipartConfig(fileSizeThreshold=58576, maxFileSize=20848820, maxRequestSize=418018841) 

public class MailApp extends HttpServlet { 
private String host; 
private String port; 

private static final String SAVE_DIR = "uploadFiles"; 

public void init() { 
    host = "smtp.gmail.com"; 
    port = "587"; } 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String recipient = null; 
    String subject = null; 
    String content = null; 
    String user = null; 
    String pass = null; 
    String fileName = null; 

// gets absolute path of the web application 
    String appPath = request.getServletContext().getRealPath(""); 
    // constructs path of the directory to save uploaded file 
    String savePath = appPath + File.separator + SAVE_DIR; 

    // creates the save directory if it does not exists 
    File fileSaveDir = new File(savePath); 
    if (!fileSaveDir.exists()) { 
     fileSaveDir.mkdir(); 
    } 

    for(Part p : request.getParts()) { 
     if("uploaded_file".equals(p.getName())) { 
      fileName = extractFileName(p); 
      // refines the fileName in case it is an absolute path 
      fileName = new File(fileName).getName(); 
      p.write(savePath + File.separator + fileName); 
     } 
     else if("recipient".equals(p.getName())) {recipient = request.getParameter("recipient");} 
     else if("subject".equals(p.getName())) {subject = request.getParameter("subject");} 
     if("content".equals(p.getName())) {content = request.getParameter("content");} 
     else if("user".equals(p.getName())) {user = request.getParameter("user");} 
     else if("pass".equals(p.getName())) {pass =request.getParameter("pass");} 

    } 
String resultMessage = ""; 


    try {    
     SendMail.sendEmail(host, port, user, pass, recipient, subject, content, fileName); 
     resultMessage = "The e-mail was sent successfully"; 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     resultMessage = "There were an error: " + ex.getMessage(); 
    } 
    finally { 
     request.setAttribute("Message", resultMessage); 
     getServletContext().getRequestDispatcher("/iml.jsp").forward(
       request, response); 
    } 
} 
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 ""; 
}} 

SendMail.java:

public class SendMail 
{ 
    public static void sendEmail(String host, String port, 
      final String userName, final String password, String toAddress, 
      String subject, String message,String fileName) throws AddressException, 
      MessagingException { 


     // sets SMTP server properties 
     Properties properties = new Properties(); 
     properties.put("mail.smtp.host", host); 
     properties.put("mail.smtp.port", port); 
     properties.put("mail.smtp.auth", "true"); 
     properties.put("mail.smtp.starttls.enable", "true"); 

     // creates a new session with an authenticator 
     Authenticator auth = new Authenticator() { 
      public PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(userName, password); 
      } 
     }; 

     Session session = Session.getInstance(properties, auth); 

     // creates a new e-mail message 
     Message msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(userName)); 
     InternetAddress[] toAddresses = { new InternetAddress(toAddress) }; 
     msg.setRecipients(Message.RecipientType.TO, toAddresses); 
     msg.setSubject(subject); 
     msg.setSentDate(new Date()); 

     MimeBodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setContent(message, "text/html"); 

     // creates multi-part 
     Multipart multipart = new MimeMultipart(); 
     DataSource source = new FileDataSource(fileName); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(fileName); 
     multipart.addBodyPart(messageBodyPart); 


     // sets the multi-part as e-mail's content 
     msg.setContent(multipart); 

    try{  // sends the e-mail 
     Transport.send(msg); 
    } 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
} 

私はそれを

+0

'Paths.get(filePart.getSubmittedFileName())。getFileName()。toString();'はあなたに正確なファイル名を与え、 'Paths.get(filePart.getSubmittedFileName())'はファイルを与えますパス。 '.getFileName.toString()'なしで試してみましょう。 –

+0

'Paths.get(filePart.getSubmittedFileName())。toString();'を使用しましたが、まだファイル名のみを取得しています。 – pmgowda

+0

'getRealPath()'の使用をやめてください。 – BalusC

答えて

0
  1. を解決する助けてくださいアップロードしたファイルを保存するディレクトリを作成する必要があります

  2. は、あなたが使用することによって、あなたが保存ファイルにアップロードされたファイルを書き込むことが旧姓ファイル

  3. のための完全なパスを作成する必要があります:あなたはthisリンクをたどることができ

    filePart.write(FULL_FILE_PATH); 
    
+0

ファイルをアップロードした後にテキストパラメータにrequest.getparameter()を使用できますか? – pmgowda

+0

あなたに答えて、私はMailApp.javaのコードを変更しましたが、同じerror.pleaseを取得しています。 – pmgowda

+0

少しの微調整の後に答えが見つかりました。正しい方向に私を指差してくれてありがとう。 – pmgowda

0

さて、 私はここで間違っている可能性があります... 保存中(書き込み中)

p.write(savePath + File.separator + fileName); 

しかし、 "sendEmail"を呼び出す際には、 "ファイル名"のみを送信していますが、 は「savePath + File.separator + fileName」ではありませんか?

+0

それを試しても、同じ例外が発生します。絶対パスを抽出できないと思う。 – pmgowda

+0

さて、パーミッションもチェックしてください。 "SAVE_DIR"でファイルが作成されていますか? – anupkholgade

+0

はい、作成されています。ここでは、ファイルが格納されているパスを "E:\ java WS \ .metadata \ .plugins \ org.eclipse.wst.server.core \ tmp0 \ wtpwebapps \ Mwa \\ uploadFiles"としています。問題はアップロードファイルの前に2つの '\'が付いているのでしょうか? – pmgowda

関連する問題