2016-08-10 18 views
0

HTMLフォームに送信された画像ファイル名を学生IDのままデータベースに保存します。JSPで "Part"タイプのファイルからファイル名を抽出する方法は?

だから、私は最初に使用して、HTMLフォームからイメージファイルを取得する:

 Part filePart = request.getPart("photo"); 

をしかし、私はちょうどHTML形式のinputタグの名前です"photo"取得filePart.getName();を使用する場合 - <td><input type="file" name="photo" size="50"/></td>を。

filePart.getSubmittedFileName();を使用すると、パス全体がC:\Users\bnbih\Pictures\testo.jpgのようになります。

ファイル名のみを取得する方法はありますか?これは "testo"です

これは私のJSPファイルです。

/** 
* 
* @author bnbih 
*/ 
@WebServlet(urlPatterns = {"/uploadServlet"}) 
@MultipartConfig(maxFileSize = 16177215) // upload file's size up to 16MB 
public class FileUploadDBServlet extends HttpServlet { 

    // database connection settings 
    private String dbURL = "jdbc:mysql://server_IP:3306/db_name"; 
    private String dbUser = "root"; 
    private String dbPass = ""; 
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     InputStream inputstream = null;//input stream of the uploaded photo 

     Part filePart = request.getPart("photo"); 
     if(filePart != null){ 

     //print out file info for debugging 
     System.out.println(filePart.getName()); 
     System.out.println(filePart.getSize()); 
     System.out.println(filePart.getContentType()); 

     //get the file 
     inputstream = filePart.getInputStream(); 

     } 
     Connection con = null; 
     String message = null; 

     try{ 
     //connect to the database 
     DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
     con = DriverManager.getConnection(dbURL, dbUser, dbPass); 

     //construct sql statement 
     String sql = "INSERT INTO StudentInfo (img, student) values (?,?)"; 
     PreparedStatement statement = con.prepareStatement(sql); 

     if(inputstream != null){ 
     //fetches input stream of the upload file for the blob column 
     statement.setBlob(1, inputstream); 
     statement.setString(2, filePart.getSubmittedFileName()); 
     } 

     //sends the statement to the database server 
     int row = statement.executeUpdate(); 

     if(row > 0){ 
     message = "Student image uploaded successfully"; 
     } 


     }catch(SQLException ex){ 
     message = "Something went wrong!! see below \n" + ex.getMessage() + filePart.getSubmittedFileName(); 
     }finally{ 
     if(con != null){ 
     //close db connection 
     try{ 
     con.close(); 
     }catch(SQLException ex){ 
      ex.printStackTrace(); 
     } 
    } 

//sets the message in request scope 

request.setAttribute("Message", message); 

// forwards to the message page 
getServletContext().getRequestDispatcher("/Message.jsp").forward(request, response); 

} 




     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 
      /* TODO output your page here. You may use following sample code. */ 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet FileUploadDBServlet</title>");    
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>Servlet FileUploadDBServlet at " + request.getContextPath() + "</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 
    } 

} 

答えて

2

アップロード要求を送信中にあなたがクライアント上でいくつかのdevのツール(私はChromeを好む)に見た場合、あなたはそのヘッダに各ファイルにasociated 2つの項目は(おそらくあるマルチパートの各部分がそのを持っていることに気づくことができます自分のヘッダーとボディ)。ファイル名はファイルの一部ではなく、余分に送信する必要があるファイルシステムのプロパティであるため、最初は名前で、これはフォームフィールドIDを識別し、2番目はファイル名で、ブラウザから送信されます。サーブレットAPI 3.1を使用している場合は、getSubmittedFileName()を呼び出すか、自分で解析してください。

ちょっと警告がありますが、すべてのブラウザが同じ情報を送信するわけではありません。しかし、ファイル名だけを解析できるライブラリがたくさんあります。たとえば、Java 7 Path Paths.get(filePart.getSubmittedFileName()).getFileName().toString()で十分です。

+0

ありがとうございました。私はまた私の答えに含める方法であなたのコードを使用したので、別の人に同じ需要があるので、拡張を削除したい。 – Sei

0

これは、パスまたは拡張子なしでファイル名自体を取得するという点で私の問題を完全に解決する方法です。

protected String getFileName(Part p){ 

String GUIDwithext = Paths.get(p.getSubmittedFileName()).getFileName().toString(); 

String GUID = GUIDwithext.substring(0, GUIDwithext.lastIndexOf('.')); 

return GUID; 
    } 
関連する問題