0

When I learn how to use servlet to achieve file uploading, I met this problem. details are as follows, my full code:

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.io.*;
import java.util.List;

public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            // set Content-Type
            resp.setHeader("Content-type", "text/html;charset=UTF-8");
            // create DiskFileItemFactory object
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // set file temporary storage path, if the path does not exist, create it
            factory.setRepository(new File("D:\\source\\jsp\\fileupdown\\temp"));
            if (!factory.getRepository().exists()) {
                factory.getRepository().mkdirs();
            }
            // set ServletFileUpload object
            ServletFileUpload upload = new ServletFileUpload(factory);
            // set character encoding
            upload.setHeaderEncoding("UTF-8");
            // analyze request, get file item list
            List<FileItem> fileitems = upload.parseRequest(req);
            // get byte stream
            PrintWriter writer = resp.getWriter();
            // traverse file item list
            for (FileItem fileitem : fileitems) {
                // if it is a form field
                if (fileitem.isFormField()) {
                    // get field name
                    String name = fileitem.getFieldName();
                    if (name.equals("name")) {
                        if (fileitem.getString("UTF-8").equals("")) {
                            writer.println("name can not be empty");
                        } else {
                            writer.println("name:" + fileitem.getString("UTF-8"));
                        }
                    }
                } else {
                    // get file name
                    String filename = fileitem.getName();
                    // process file
                    if (filename != null && !filename.equals("")) {
                        writer.print("uploaded file:" + filename + "<br>");
                        filename = filename.substring(filename.lastIndexOf("\\") + 1);
                        // unique file name
                        String uniqueFileName = System.currentTimeMillis() + "_" + filename;
                        // create same name file in server
                        String webPath = "/upload/";
                        String realPath = getServletContext().getRealPath(webPath + uniqueFileName);
                        // create file
                        File file = new File(realPath);
                        file.getParentFile().mkdirs();
                        file.createNewFile();
                        // get UploadStream
                        InputStream in = fileitem.getInputStream();
                        // use FileOutputStream to write file
                        FileOutputStream out = new FileOutputStream(file);
                        // create buffer
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        // read file
                        while ((len = in.read(buffer)) > 0) {
                            out.write(buffer, 0, len);
                        }
                        in.close();
                        out.close();
                        writer.println("upload successfully");
                    } else {
                        writer.println("file can not be null");
                    }
                }
            }
        } catch (FileUploadException e) {
            throw new RuntimeException(e);
        }
    }

}

the error:

java: Cannot access javax.servlet.http.HttpServletRequest
Cannot find class file of javax.servlet.http.HttpServletRequest

the code that reports the error:

// set ServletFileUpload object
ServletFileUpload upload = new ServletFileUpload(factory);
// set character encoding
upload.setHeaderEncoding("UTF-8");
// analyze request, get file item list
List<FileItem> fileitems = upload.parseRequest(req);

I have tried to rewrite the code as follows:

// set ServletFileUpload object
ServletFileUpload upload = new ServletFileUpload(factory);
// set character encoding
upload.setHeaderEncoding("UTF-8");
// analyze request, get file item list
List<FileItem> fileitems = upload.parseRequest((RequestContext) req);

but it still cannot work.

I think the error comes from the difference between package javax and jakarta. The acticles teching how to use servlet to upload file use the old version servlet in javax while i use servlet in jakarta. However, I searched for a long time on the Internet and could not find a way to solve the error without changing the jakarta to javax.

Thx for your help.

SCUTVK
  • 3
  • 1
  • Since Servlet API version 3.0 (already released way back in 2009!!) it is not anymore necessary to use Apache Commons FileUpload. Please catch up timely with the current state of technology. See abovelinked duplicate for the proper approach. – BalusC Nov 21 '22 at 12:32

0 Answers0