欢迎访问宙启技术站
智能推送

怎么用java实现文件上传和下载

发布时间:2023-05-18 12:41:04

使用java实现文件上传和下载主要有以下两种方式:

1.使用Java Servlet和JSP实现文件上传和下载

文件上传和下载实现的基本原理是:客户端向服务器发送请求,服务器将文件保存或者读取,然后传输到客户端。

文件上传主要步骤:

(1)利用HTML表单,客户端向服务器发送文件上传请求。

(2)服务器端的Servlet响应请求,将上传的文件保存在服务器的指定目录中。

(3)响应客户端上传成功的提示信息。

文件下载主要步骤:

(1)客户端向服务器发送文件下载请求。

(2)服务器端的Servlet响应请求,读取要下载的文件并将其传输到客户端。

(3)响应客户端成功接收文件的提示信息。

下面是实现文件上传和下载的代码示例:

文件上传代码示例:

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/fileUploadServlet"})
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置字符编码方式为UTF-8
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        // 获取上传的文件
        Part filePart = request.getPart("file");
        String fileName = getFileName(filePart);
        
        // 将文件保存在服务器指定的目录中
        String fileDir = "D:/upload/";
        String filePath = fileDir + fileName;
        InputStream inputStream = filePart.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream(filePath);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, len);
        }
        fileOutputStream.close();
        inputStream.close();
        
        // 响应客户端上传成功的提示信息
        PrintWriter out = response.getWriter();
        out.write("<script>alert('上传成功!');</script>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    // 获取上传的文件名
    private String getFileName(Part part) {
        String contentDisposition = part.getHeader("content-disposition");
        String[] items = contentDisposition.split(";");
        for (String item : items) {
            if (item.trim().startsWith("filename")) {
                return item.substring(item.indexOf("=") + 2, item.length() - 1);
            }
        }
        return "";
    }
}

文件下载代码示例:

@WebServlet(name = "FileDownloadServlet", urlPatterns = {"/fileDownloadServlet"})
public class FileDownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("fileName");
        String filePath = "D:/upload/" + fileName;
        
        // 设置响应消息头,告诉客户端要下载的文件类型和文件名
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        
        // 读取要下载的文件并将其传输到客户端
        FileInputStream fileInputStream = new FileInputStream(filePath);
        int len;
        byte[] buffer = new byte[1024];
        OutputStream outputStream = response.getOutputStream();
        while ((len = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.close();
        fileInputStream.close();
    }
}

2.使用Apache Commons FileUpload实现文件上传和下载

Apache Commons FileUpload是一个用于上传文件的专门库,使用该库可以方便的实现文件上传和下载。下面是使用Apache Commons FileUpload实现文件上传和下载的代码示例:

文件上传代码示例:

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/fileUploadServlet"})
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置字符编码方式为UTF-8
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        // 创建文件上传处理器
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        
        // 获取上传文件
        List<FileItem> fileItemLists = servletFileUpload.parseRequest(request);
        FileItem fileItem = fileItemLists.get(0);
        String fileName = fileItem.getName();
        
        // 将上传的文件保存在服务器指定的目录中
        String fileDir = "D:/upload/";
        String filePath = fileDir + fileName;
        fileItem.write(new File(filePath));
        
        // 响应客户端上传成功的提示信息
        PrintWriter out = response.getWriter();
        out.write("<script>alert('上传成功!');</script>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

文件下载代码示例:

@WebServlet(name = "FileDownloadServlet", urlPatterns = {"/fileDownloadServlet"})
public class FileDownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("fileName");
        String filePath = "D:/upload/" + fileName;
        
        // 设置响应消息头,告诉客户端要下载的文件类型和文件名
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        
        // 读取要下载的文件并将其传输到客户端
        FileInputStream fileInputStream = new FileInputStream(filePath);
        int len;
        byte[] buffer = new byte[1024];
        OutputStream outputStream = response.getOutputStream();
        while ((len = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.close();
        fileInputStream.close();
    }
}

综上,以上是使用Java Servlet和JSP,以及Apache Commons FileUpload实现文件上传和下载的两种方式,可以根据具体场景选择合适的方式进行文件上传和下载。