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

实现Java函数处理文件上传和下载操作

发布时间:2023-05-28 15:20:22

Java是一种开发语言,可以用来实现文件上传和下载操作。Java中有两种主要的文件上传方式:基于Servlet和基于Spring MVC。使用Servlet的方式可以使用标准Java Servlet API来实现。使用Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件上传的类。

文件上传

使用Servlet的方式

Servlet的方式可以使用标准Java Servlet API来实现。以下是使用Servlet的方式来实现文件上传的示例:

import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class FileUploadServlet extends HttpServlet {

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

        //获取请求中所有的文件,使用Part类
        List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList());
        //存储文件
        for(Part filePart : fileParts) {
            String fileName = getFileName(filePart);
            InputStream fileContent = filePart.getInputStream();
            File uploadedFile = new File("/path/to/uploads/" + fileName);
            try (FileOutputStream out = new FileOutputStream(uploadedFile)) {
                int read = 0;
                final byte[] bytes = new byte[1024];
                while ((read = fileContent.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
            }
        }
    }

    private String getFileName(final Part part) {
        final String partHeader = part.getHeader("content-disposition");
        for (String content : partHeader.split(";")) {
            if (content.trim().startsWith("filename")) {
                return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
            }
        }
        return null;
    }
}

使用Spring MVC的方式

Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件上传的类。以下是使用Spring MVC的方式来实现文件上传的示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.File;
import java.io.IOException;

@Controller
public class FileUploadController {

    @PostMapping("/upload/file")
    @ResponseBody
    public String uploadFile(@RequestParam("file") MultipartFile file) {

        if (file.isEmpty()) {
            return "上传失败,请选择文件";
        }

        String fileName = file.getOriginalFilename();
        File dest = new File("/path/to/uploads/" + fileName);
        try {
            file.transferTo(dest);
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败!";

    }
}

文件下载

使用Servlet的方式

Servlet的方式可以使用标准Java Servlet API来实现。以下是使用Servlet的方式来实现文件下载的示例:

import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownloadServlet extends HttpServlet {

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

        String fileName = request.getParameter("file");

        if (fileName == null || "".equals(fileName)) {
            //没有指定文件名
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        File file = new File("/path/to/files/" + fileName);

        if (file.exists() && file.canRead()) {
            String mimeType = "application/octet-stream";
            response.setContentType(mimeType);

            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

            int fileSize = (int) file.length();

            response.setContentLength(fileSize);

            FileInputStream in = new FileInputStream(file);
            OutputStream out = response.getOutputStream();

            byte[] buffer = new byte[1024];
            int bytesRead = -1;

            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }

            in.close();
            out.close();

        } else {
            //文件不存在或不可读
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

    }
}

使用Spring MVC的方式

Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件下载的类。以下是使用Spring MVC的方式来实现文件下载的示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@Controller
public class FileDownloadController {

    @RequestMapping(value = "/download/file", method = RequestMethod.GET)
    @ResponseBody
    public String downloadFile(HttpServletRequest request,
                               HttpServletResponse response,
                               @RequestParam("fileName") String fileName) {

        if (fileName == null || "".equals(fileName)) {
            return "下载失败,请选择文件";
        }

        String filePath = "/path/to/files/" + fileName;
        File file = new File(filePath);

        if (file.exists()) {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            OutputStream os = null;
            try {
                os = response.getOutputStream();
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bis.close();
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return "下载成功";
        } else {
            return "文件不存在";
        }

    }
}

以上是使用Java实现文件上传和下载操作的示例,这些示例可以根据实际需求进行调整。这些示例可以帮助开发人员了解如何使用Java来实现文件上传和下载操作。