【问题标题】:Upload a photo to a DB using servlets使用 servlet 将照片上传到数据库
【发布时间】:2013-11-17 17:33:32
【问题描述】:

我正在尝试制作一个将图像上传并插入数据库的 Servlet。 此图像是数据库中的 blob 类型。 代码给了我这个错误: org.netbeans.modules.web.monitor.server.MonitorRequestWrapper 无法转换为 org.apache.tomcat.util.http.fileupload.RequestContext [Ljava.lang.StackTraceElement;@30ec706b

这是我的代码的一部分: ## web.xml ##

        <servlet>
          <servlet-name>UploadServlet</servlet-name>
          <servlet-class>Servlet.UploadServlet</servlet-class>
            <init-param>
              <param-name>uploadDir</param-name>
              <param-value>/tmp</param-value>
             </init-param>
         </servlet>

数据Utente

    protected void processRequest(HttpServletRequest request, HttpServletResponse           
                                   response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session=request.getSession(false);
        PrintWriter out = response.getWriter();

        try {

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet DataUtente</title>");            
            out.println("</head>");
            out.println("<body>");
            Utente utente =(Utente)session.getAttribute("utente");
            out.println("<h1> Welcome  " + utente.getUsername() + "</h1>");

            out.println("    <form name=\"myWebForm\" action=\"UploadServlet\"                  
                             method=\"POST\" ENCTYPE=\"multipart/form-data\">\n" + 
                        " <input type=\"file\" name=\"uploadField\" />\n" +
                        " <INPUT TYPE='submit' VALUE='upload'>"+
                        "</form>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

上传服务

public class UploadServlet extends HttpServlet {
   DBManager dbman;
   private int maxFileSize = 50 * 1024;
   private int maxMemorySize = 4 * 1024;
   private File file ;
   private String dirName;

    public void init(ServletConfig config) throws ServletException{
        super.init(config);

          //read the uploadDir from the servlet parameters 
        dirName=config.getInitParameter("uploadDir");
        if(dirName== null){
            throw  new ServletException("Please supply uploadDir parameters");
        }
    }
    protected void processRequest(HttpServletRequest request, HttpServletResponse   
                                    response)
            throws ServletException, IOException {
             response.setContentType("text/html;charset=UTF-8");
             HttpSession session=request.getSession(false);
             PrintWriter out = response.getWriter();
        try {
            // Apache Commons-Fileupload library classes
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //maximum size that will be stored in memory 
            factory.setSizeThreshold(maxMemorySize);
           //create a file upload handler
            ServletFileUpload upload  = new ServletFileUpload(factory);
           // maximum file size to be uploaded.
            upload.setSizeMax( maxFileSize );

            if (! ServletFileUpload.isMultipartContent(request)) {
                System.out.println("sorry. No file uploaded");
                return;
            }

               // parse request
            List items = upload.parseRequest((RequestContext) request);
               // get uploaded file
            FileItem file = (FileItem) items.get(0);

            // Connect to the DB

            dbman = new DBManager();
            Utente utente=(Utente)session.getAttribute("utente");
            //String query = "insert into photos values(?)";        
            PreparedStatement ps = dbman.connectToDB().prepareStatement("insert  into 
                        Utente(avatar) values(?) where Id='" + utente.getId() + "'");


            ps.setBinaryStream(1, file.getInputStream(), (int) file.getSize());
            ps.executeUpdate();
           // dbman.connectToDB().commit();
            dbman.connectToDB().close();
            out.println("Proto Added Successfully. <p> <a href='listphotos'>List Photos   
                         </a>");
        }
        catch(Exception ex) {
            out.println( "Error ==> " + ex.getMessage());
            out.print(ex.getStackTrace());
        }
     }

这里是 DDmanager:

public void  closeConnection(){
        try {
            dbConnection.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public Connection connectToDB() throws SQLException, ClassNotFoundException{
         String dbString = null;
            Class.forName(driver);
            dbString = "jdbc:derby://localhost:1527/DB";
            dbConnection = (Connection) DriverManager.getConnection(dbString, userName, 
                              password);
        return dbConnection;

    }

    public boolean connectToDb() {
        //conneto a db 
        try {
            String dbString = null;
            Class.forName(driver);
            dbString = "jdbc:derby://localhost:1527/DB";
            dbConnection = (Connection) DriverManager.getConnection(dbString, userName, 
                              password);

        } catch (Exception e) {
            e.printStackTrace();
       //     System.out.print("erore");
            return false;
        }
        return true;

    }

    public ResultSet executeQuery(String command) {
        try {
            stmt = dbConnection.createStatement();
            ResultSet ress = stmt.executeQuery(command);
            return ress;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void  executeUpdateQuery(String command) {
        try {
            stmt = dbConnection.createStatement();
            int ress = stmt.executeUpdate(command);
            stmt.close();  

        } catch (Exception e) {
            e.printStackTrace();

        }

【问题讨论】:

    标签: java jakarta-ee file-upload servlet-3.0


    【解决方案1】:

    看你的apache tomcat版本,我升级到7.0.41,TBM报错,回到7.0.34又能正常工作,7.0.41还没找到办法

      List items = upload.parseRequest((RequestContext) request);
    

    如果返回apache的版本,则删除转换(RequestContext)

    List items = upload.parseRequest(request);
    

    【讨论】:

      【解决方案2】:

      我使用了替代类:

      导入 org.apache.commons.fileupload.FileItem; 导入 org.apache.commons.fileupload.FileItemFactory; 导入 org.apache.commons.fileupload.FileUploadException; 导入 org.apache.commons.fileupload.disk.DiskFileItemFactory; 导入 org.apache.commons.fileupload.servlet.ServletFileUpload; @WebServlet("/FileUploadServlet") 公共类 FileUploadServlet 扩展 HttpServlet { 私有静态最终长序列版本UID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload 上传 = new ServletFileUpload(factory); // 设置文件上传进度监听 FileUploadListener listener = new FileUploadListener(); HttpSession 会话 = request.getSession(); session.setAttribute("监听器", 监听器); //上传servlet允许设置上传监听 upload.setProgressListener(listener); 列出uploadedItems = null; 文件项文件项=空; 字符串文件路径 = "c:\\My\\tmp"; // 在本地系统上存储文件的路径 尝试 { // 获取所有上传的文件 UploadItems = upload.parseRequest(request); // 迭代器 i = UploadItems.iterator(); 如果(上传项目.size()> 0){ fileItem = (FileItem) UploadItems.get(0);//i.next(); if (fileItem.isFormField() == false) { if (fileItem.getSize() > 0) { 文件上传File = null; 字符串 myFullFileName = fileItem.getName(), 我的文件名 = "", slashType = (myFullFileName.lastIndexOf("\\") > 0) ? "\\" : "/"; // Windows 或 UNIX 整数 startIndex = myFullFileName.lastIndexOf(slashType); // 忽略路径并获取文件名 myFileName = "imgout.jpg"; //myFullFileName.substring(startIndex + 1, myFullFileName.length()); // 创建新的文件对象 uploadFile = new File(filePath, myFileName); // 将上传的文件写入系统 fileItem.write(uploadedFile); } } } } catch (FileUploadException e) { e.printStackTrace(); } 捕获(异常 e){ e.printStackTrace(); } }

      【讨论】:

        猜你喜欢
        • 2013-01-23
        • 2020-06-10
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多