springMVC实现文件的上传和下载

本文介绍如何在SpringMVC中实现文件的上传和下载功能。包括配置所需的jar包、设置multipartResolver属性、实现上传逻辑并通过两种不同方法进行文件上传,以及文件下载的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在springMVC中,可以通过流的方式进行文件的上传和下载,也可以通过springMVC自己提供的方式

首先要加两个包 common.io和common-fileupload这两个jar包



随后是在mvc-dispatcher-servlet中 配置相关的id属性

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <property name="maxUploadSize" value="104857600" />
     <property name="maxInMemorySize" value="4096" />
     <property name="defaultEncoding" value="UTF-8"></property>
</bean>
这里配置的是文件上传时候的最大值 和编码格式等

随后记住要在web,xml中的url-pattern中改掉过滤路径为"/"否则系统会匹配不到

随后是前端页面的编码 只是一个简单的jsp界面的编写

<form name="serForm" action="/SpringMVCUploadFile/springUpload" method="post"  enctype="multipart/form-data">
<h1>采用流的方式上传文件</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
这里指定这个form发生的动作 要制定为项目名下的动作 并且method要配置为post type也要设置好

随后便是核心代码块的编写 首先是以流的形式进行下载

@RequestMapping("/fileUpload")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException{
	//用来检测程序运行的时间
	long startTime = System.currentTimeMillis();
	System.out.println("fileName:" + file.getOriginalFilename());
	try{
           OutputStream os=new FileOutputStream("E:/"+new Date().getTime()+file.getOriginalFilename());
	      //获取输入流
           InputStream is = file.getInputStream();
           int temp;
           //一个一个字节的读入
           while((temp = is.read()) != -1){
        	   os.write(temp);
           }
           os.flush();
           os.close();
           is.close();
	System.out.println("success");
	}
	
	catch(FileNotFoundException e){
		e.printStackTrace();
	}
	  long  endTime=System.currentTimeMillis();
      System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
      return "success"; 
}
这种方式的话 上传的时间比较慢

第二种 也是推荐使用的是用springMVC提供的上传方式

//采用spring提供的上传文件的方法
@RequestMapping("/springUpload")
public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException{
	long startTime = System.currentTimeMillis();
	//将当前上下文初始化给 commonMutipartResover (多部分解析器)
	CommonsMultipartResolver mutipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
	//检查form中是否有ecctype = "mutipart/form-data
	if(mutipartResolver.isMultipart(request)){
		//将request变成多部分request
		MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
		//获取mutiRequest中所有的文件名
		Iterator iter = multiRequest.getFileNames();
		while(iter.hasNext()){
			//一次遍历所有的文件
			MultipartFile file = multiRequest.getFile(iter.next().toString());
		   if(file != null){
			   //进行上传
			   String path = "/home/ubuntu/img/"+new Date().getTime() + file.getOriginalFilename();
			   file.transferTo(new File(path));
		   }
		}
	}
    long  endTime=System.currentTimeMillis();
    System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");
return "success"; 
}
随后便可在前端界面进行上传文件的操作

详情可见这个网站
http://www.cnblogs.com/fjsnail/p/3491033.html

文件下载的方法

先指定路径 也是采用流的方法进行下载 实际上可以不用设置头信息

//文件下载
@RequestMapping("/download")
public void downLoad(HttpServletResponse res){
	//文件的目录
	String path = "/home/ubuntu/img/" + "img1.jpg";
	File file = new File(path);
	//如果文件存在的话
	if(file.exists()){
		res.setContentType("application/jpg");
		res.addHeader("Content-Disposition","attachment;filename=img1.jpg");
		byte buffer[] = new byte[1024];
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		try{
			fis = new FileInputStream(file);
			bis = new BufferedInputStream(fis);
			OutputStream os = res.getOutputStream();
			int i = bis.read(buffer);
			while(i != -1){
				os.write(buffer,0,i);
				i = bis.read(buffer);
			}
			
		}
		catch(IOException e){
		System.out.println("error");	
		}
		finally{
			  if (bis != null) {
                  try {
                      bis.close();
                  } catch (IOException e) {
                  }
              }
              if (fis != null) {
                  try {
                      fis.close();
                  } catch (IOException e) {
                  }
		
		
	}
	
}
	}
}

大致就是这样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值