java文件上传和下载的方式

java上传文件和下载文件有很多种,我只介绍两种:一是io流,二是springmvc,本人更喜欢用springmvc的方式,因为更加简单
一io流,需要导入comment.io,和comment.beabuty两个jar

以jsp+servert为例直接上代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@MultipartConfig
public class FileServlet extends HttpServlet {

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

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

        // 获取请求参数: 区分不同的操作类型
        String method = request.getParameter("method");
        if ("upload".equals(method)) {
            // 上传
            upload(request,response);
        }

        else if ("downList".equals(method)) {
            // 进入下载列表
            downList(request,response);
        }

        else if ("down".equals(method)) {
            // 下载
            down(request,response);
        }
    }


    /**
     * 1. 上传
     */
    private void upload(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    	HttpSession session=request.getSession();
    	         List<String> list=(List<String>)session.getAttribute("files");
    	         if(list==null){
    	             //如果集合为空,就创建一个集合
    	             list=new ArrayList<String>();
    	         }    
    	         
    	         try {
    	             //获取文件描述信息
    	             String desc=request.getParameter("desc");
    	             //获取上传的文件
    	             Part part=request.getPart("file");
    	             //获取请求的信息
    	             String name=part.getHeader("content-disposition");
    	             //System.out.println(name);//测试使用
    	             //System.out.println(desc);//
    	             
    	             //获取上传文件的目录
    	             String root=request.getServletContext().getRealPath("/upload");
    	             System.out.println("测试上传文件的路径:"+root);
    	             
    	             //获取文件的后缀
    	             String str=name.substring(name.lastIndexOf("."), name.length()-1);
    	             System.out.println("测试获取文件的后缀:"+str);
    	          
    	             //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
			 String fname=UUID.randomUUID().toString()+str; 
    	             //将文件名保存到集合中
    	             list.add(fname);
    	             //将保存在集合中的文件名保存到域中
    	             session.setAttribute("files", list);
    	             
    	             String filename=root+"\\"+fname;
    	             System.out.println("测试产生新的文件名:"+filename);
    	             
    	             //上传文件到指定目录,不想上传文件就不调用这个
    	             part.write(filename);
    	             
    	             request.setAttribute("info", "上传文件成功");
    	         } catch (Exception e) {
    	             e.printStackTrace();
    	             request.setAttribute("info", "上传文件失败");
    	         }
    	     	String mainPage = "upload.jsp";
    			request.setAttribute("mainPage", mainPage);
    			RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
    			dispatcher.forward(request, response);
            
      

    }


    /**
     * 2. 进入下载列表
     */
    private void downList(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        // 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示

        //1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;
        Map<String,String> fileNames = new HashMap<String,String>();

        //2. 获取上传目录,及其下所有的文件的文件名
        String bathPath = getServletContext().getRealPath("/upload");
        // 目录
        File file = new File(bathPath);
        // 目录下,所有文件名
        String list[] = file.list();
        // 遍历,封装
        if (list != null && list.length > 0){
            for (int i=0; i<list.length; i++){
                // 全名
                String fileName = list[i];
                // 短名
                String shortName = fileName.substring(fileName.lastIndexOf("#")+1);
                // 封装
                fileNames.put(fileName, shortName);
            }
        }

        // 3. 保存到request域
        request.setAttribute("fileNames", fileNames);
        // 4. 转发
        String mainPage = "downlist.jsp";
		request.setAttribute("mainPage", mainPage);
		RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
		dispatcher.forward(request, response);

    }


    /**
     *  3. 处理下载
     */
    private void down(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        // 获取用户下载的文件名称(url地址后追加数据,get)
        String fileName = request.getParameter("fileName");
        fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");

        // 先获取上传目录路径
        String basePath = getServletContext().getRealPath("/upload");
        // 获取一个文件流
        InputStream in = new FileInputStream(new File(basePath,fileName));

        // 如果文件名是中文,需要进行url编码
        fileName = URLEncoder.encode(fileName, "UTF-8");
        // 设置下载的响应头
        response.setHeader("content-disposition", "attachment;fileName=" + fileName);

        // 获取response字节流
        OutputStream out = response.getOutputStream();
        byte[] b = new byte[1024];
        int len = -1;
        while ((len = in.read(b)) != -1){
            out.write(b, 0, len);
        }
        // 关闭
        out.close();
        in.close();


    }

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

}

原理不多说了,就是通过读取http请求中的信息流,在cope到本地实现的

二springmvc方式实现就更加简单了,也直接上代码:
import com.xiaomin.qq.enums.ResponseEnum;
import com.xiaomin.qq.vo.ResponseVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.math.BigDecimal;

/**
 * @Author 无名小卒
 * @Date 2020/6/11 2:41
 * @Version 1.0
 */

@Slf4j
public class FileUtil {
    /**
     *      * 获取文件大小
     *      * 
     *      * @param size
     *      * @return
     *     
     */
    public static String getPrintSize(long bytes) {

        BigDecimal filesize = new BigDecimal(bytes);
        BigDecimal megabyte = new BigDecimal(1024 * 1024);

        float returnValue = filesize.divide(megabyte, 2, BigDecimal.ROUND_UP).floatValue();
        if (returnValue > 1) {
            return (returnValue + "MB");
        }
        BigDecimal kilobyte = new BigDecimal(1024);
        returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();
        return (returnValue + "KB");
    }

    /*上传文件*/
    public static ResponseVo<Object> uploadFile(MultipartFile file, String newfileName) {
        if (file.isEmpty()) {
            return ResponseVo.error(ResponseEnum.ERROR);
        }
        try {
            /*旧文件名*/
            String fileName = file.getOriginalFilename();
            /*文件存储的位置*/
            String filePath = "D://upload//";
            // 获取文件的拓展名
            String extension = "." + FilenameUtils.getExtension(fileName);
            /*获取文件类型*/
            String type = file.getContentType();
            /*获取文件大小*/
            long size = file.getSize();
            /*新文件名*/

            File dest = new File(filePath + newfileName);
            /*上传文件*/
            file.transferTo(dest);
        } catch (IOException e) {
            log.error(e.toString(), e);
        }
        return ResponseVo.success(ResponseEnum.REQUESTER_SUCCESS);

    }

    /*下载文件*/
    public static ResponseEntity<Object> downloadFile(String fileName) {
        String filePath = "D://upload//";
        File file = new File(filePath + fileName);
        InputStreamResource resource = null;
        try {
            resource = new InputStreamResource(new FileInputStream((file)));
        } catch (FileNotFoundException e) {
            log.error(e.toString(), e);
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", String.format("attachment;filename=\"%s\"", file.getName()));
        headers.add("Cache-Control", "no-cache,no-store,must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        ResponseEntity<Object> responseEntity = ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/text"))
                .body(resource);
        return responseEntity;
    }

    /*删除文件*/
    public static ResponseVo deleleFile(String fileName) {
        //根据文件夹获取此文件夹的真实路径既是绝对路径
        String realPath = "D://upload//";
        //打印看一下绝对路径是否有误
        System.out.println(realPath);
        //根据文件的路径获取此文件
        File file = new File(realPath + "/" + fileName);
        //判断此文件是否为空
        if (file != null) {
            //文件不为空,执行删除
            file.delete();
            return ResponseVo.success(ResponseEnum.REQUESTER_SUCCESS);
        } else {
            //为空提示错误信息
            return ResponseVo.error(ResponseEnum.ERROR);
        }

    }

}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传下载是Web开发中常见的功能之一,Java 8 也提供了相关的API来实现这些功能。下面是一个简单的示例代码: 文件上传: ```java @RequestMapping(value = "/upload", method = RequestMethod.POST) public String uploadFile(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "上传文件为空"; } try { byte[] bytes = file.getBytes(); Path path = Paths.get("uploads/" + file.getOriginalFilename()); Files.write(path, bytes); } catch (IOException e) { e.printStackTrace(); } return "文件上传成功"; } ``` 文件下载: ```java @RequestMapping(value = "/download", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadFile() throws IOException { Path path = Paths.get("uploads/example.txt"); byte[] bytes = Files.readAllBytes(path); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=example.txt"); ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, HttpStatus.OK); return responseEntity; } ``` 在上面的代码中,文件上传使用了Spring MVC框架的 @RequestParam 注解来获取上传的文件对象,然后使用 Java 的 Files.write() 方法将文件写入指定路径。 文件下载使用了 ResponseEntity<byte[]> 类型来将文件内容以二进制字节流的形式返回给客户端。同时使用 HttpHeaders 设置文件名和下载方式。 当然,这只是一个简单的示例,实际应用中可能需要进行更多的文件处理和安全校验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值