2016-08-10 3 views
0

Я хочу сохранить имя файла изображения, представленного в HTML-форме в базе данных, так как это идентификатор студента.Как извлечь имя файла из файла типа «Part» в JSP?

Итак, я сначала получить файл изображения из HTML-формы с помощью:

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

Однако, когда я использую filePart.getName(); Я просто "photo" который является имя входного тега в HTML-форме - <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

Если вы посмотрите на некоторые средства разработки (я предпочитаю Chrome) на вашем клиенте при отправке запроса загрузки, вы можете заметить, что в его заголовке есть, вероятно, 2 шт asociated с каждым файлом (каждая часть многоголосного имеет свой собственный заголовок и тело). Первое - это имя, которое, как вы уже знаете, идентифицирует идентификатор поля формы, а второе - имя файла, которое отправляется браузером, поскольку имена файлов не являются частью файла, а свойство файловой системы, которое необходимо отправить дополнительно. Вы можете получить эту информацию, вызвав getSubmittedFileName(), если вы используете сервлет API 3.1, или проанализируйте его самостоятельно.

Просто небольшое предупреждение, не каждый браузер отправляет ту же информацию, что и я, по-моему, отправляет полный путь к файлу. Но есть много библиотек, которые могут анализировать только имя файла, например 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; 
    }