Java-常用上传文件及下载文件的方法

本文详细介绍了三种在Java中实现文件上传和下载的方法。第一种利用`HttpServletRequest`的`Part`接口,第二种借助`commons-fileupload`库,第三种是Spring MVC框架下的文件操作。每种方法都提供了完整的代码示例,涵盖了文件的保存、删除以及错误处理。对于下载,还涉及了文件不存在时的重定向处理和文件内容的输出。
摘要由CSDN通过智能技术生成

Java-常用上传文件及下载文件的方法


第1种:利用request中的part

@MultipartConfig //支持二进制处理
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    String path = "D:/Downloads/upload/"; //存放文件的根目录
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8"); //设置请求编码

        //获取传递过来的文件 part代表一个文件
        Part file = req.getPart("file");
        //获取提交文件的文件名
        String fileName = file.getSubmittedFileName();

        //获取输入流
        InputStream inputStream = file.getInputStream();
        //创建一个输出流
        FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);
        //创建一个byte字节数组
        byte[] data = new byte[1024];
        int len; //记录长度
        while ((len = inputStream.read(data)) != -1){
            //对上传文件经行输出
            fileOutputStream.write(data,0,len);
        }
        //关闭资源
        inputStream.close();
        fileOutputStream.close();
    }
}

第2种:利用commons-fileupoad上传文件

下载commons-fileupload.jar,commons-io.jar包

1.0版:

@RequestMapping(value="/testFileUpload")
public String testFileUpload(HttpServletRequest request) throws Exception{
	//获得服务器上的 upload目录的绝对路径
	String path=request.getSession().getServletContext().getRealPath("/upload/");
	//创建一个文件对象
	File file=new File(path);
	//判断是否有此文件夹
	if(!file.exists()){
		//创建文件夹
		file.mkdirs();
	}
	//创建一个解析文件对象
	DiskFileItemFactory factory=new DiskFileItemFactory();
	//将解析对象   放在  文件上传对象中
	ServletFileUpload upload=new ServletFileUpload(factory);
	//把request对象传入上传对象中进行解析   
	//因为多个file表单是可以上传多个文件  request分段的   所以存入list中
	List<FileItem> items=upload.parseRequest(request);
	//开始将文件写入(上传)到服务器的   upload目录中
	for(FileItem item:items){
		//判断表单是否为file表单类型
		if(item.isFormField()){
			//如果是普通表单类型 做出处理
		}else{
			//是file表单类型  得到上传的文件名
			String filename=item.getName();
			//创建唯一文件名()保证同一个文件的时候不会被覆盖
			String uuid=UUID.randomUUID().toString().replace("_", "");
			filename=uuid+"_"+filename;
			//开始上传
			item.write(new File(path,filename));
			//清理临时文件
			item.delete();
		}
	}
	return "success";
}

2.0版:

@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {
    public static final String UPLOAD_PATH="D:\\upload\\";

    /**
     * 上传轮播图片
     * @param req
     * @param resp
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("上传图片uploadImg");

        //将解析对象   放在  文件上传对象中
        ServletFileUpload upload=new ServletFileUpload();
        try {
            FileItemIterator itemIterator = upload.getItemIterator(req);
            while (itemIterator.hasNext()){
                FileItemStream item = itemIterator.next();
                if(item.isFormField()){
                    System.out.println(item.getFieldName());
                }else {
                    String name = item.getName();
                    //获得随机名字
                    name=UUID.randomUUID().toString().replace("-","").substring(0,12)+name.substring(name.lastIndexOf("."));
                    //上传文件
                    Streams.copy(item.openStream(),new FileOutputStream(UPLOAD_PATH+name),true);
                    //响应json格式数据到前台 layui接口规定
                    resp.getWriter().write(RESPONSE.replace("XXX",name));
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

第3种:springmvc中的上传

@Controller
public class FileUploadController {
	//服务器上传路径
	String uploadPath="D:\\Downloads\\upload\\";
	//上传方法
	@RequestMapping("/fileUpload")
	public String fileUpload(@RequestParam("name") String name,
				@RequestParam("uploadfile") List<MultipartFile> uploadfile,
				HttpServletRequest request) {
		/*项目路径下文件夹
		String uploadPath=request.getServletContext().getRealPath("/upload/");*/
		//上传路径文件对象
		File filePath=new File(uploadPath);
		if(!filePath.exists()){
			filePath.mkdirs();
		}
		//上传文件
		if(uploadfile!=null && !uploadfile.isEmpty()){
			System.out.println("上传文件个数:"+uploadfile.size());
			for(MultipartFile file:uploadfile){
				//上传文件名
				String saveanme=file.getOriginalFilename();
				System.out.println("原始名为:"+saveanme);
				//新的上传文件名  (上传人+随机id+上传文件名)
				String newFilename=name+"_"+UUID.randomUUID()+"_"+saveanme;				
				try {
					//目标路径    File.separator /
					String targetPath=uploadPath+newFilename;
					System.out.println("目标文件地址"+targetPath);
					//开始上传
					file.transferTo(new File(targetPath));
				} catch (Exception e) {
					e.printStackTrace();
					return "error";
				} 
			}
		}		
		return "success";
	}

文件下载:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    String path = "D:/Downloads/upload/"; //存放文件的根目录
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得文件名字
        String file = req.getParameter("file");

        //判断文件是否存在
        File f=new File(path + file);
        if(!f.exists()){
            resp.sendRedirect("index.jsp");
            return;
        }

        //创建一个字节输入流 传入需下载文件路径
        FileInputStream is= new FileInputStream(path + file);
        //响应对象获得字节输出流
        ServletOutputStream os= resp.getOutputStream();

        //reps配置,对其文件名进行编码转换
        String filename=new String(file.getBytes(),"iso-8859-1");

        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition","attachment;filename="+filename);
        resp.setContentLength(os.available());

        //创建一个byte字节数组
        byte[] data = new byte[1024];
        int len; //记录长度
        while ((len = is.read(data)) != -1){
            //对上传文件经行输出
            os.write(data,0,len);
        }
        //关闭资源
        is.close();
        os.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记或往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值