SpringMVC: file upload and download

1. File upload


Remarks:

The following code is very mature. You only need to change the relevant class name or request path and other names in accordance with your personal needs. There is no need to modify the code significantly.

method one:

1. Import dependencies

Import the jar package uploaded by the file, commons-fileupload, Maven will automatically help us import his dependency package commons-io package;
add the following dependency in pom.xml

<!--文件上传-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
<!--servlet-api导入高版本的-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

2. Add the following configuration in the springmvc-servlet.xml file

note! The id of this bena must be: multipartResolver, otherwise the uploading file will report a 400 error!

 <!--文件上传配置-->
 <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
     <property name="defaultEncoding" value="utf-8"/>
     <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
     <property name="maxUploadSize" value="10485760"/>
     <property name="maxInMemorySize" value="40960"/>
 </bean>

CommonsMultipartFile common methods:
String getOriginalFilename(): Get the original name of the uploaded file
InputStream getInputStream(): Get the file stream
void transferTo(File dest): Save the uploaded file to a directory file

3. Write the front-end page index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit" value="upload">
  </form>
  </body>
</html>

4. Write Controller

package com.lzcu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

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

@RestController
public class FileController {
    
    
	//@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
	//批量上传CommonsMultipartFile则为数组即可
	@RequestMapping("/upload")
	public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {
    
    

		//获取文件名 : file.getOriginalFilename();
		String uploadFileName = file.getOriginalFilename();

		//如果文件名为空,直接回到首页!
		if ("".equals(uploadFileName)){
    
    
			return "redirect:/index.jsp";
		}
		System.out.println("上传文件名 : "+uploadFileName);

		//上传路径保存设置
		String path = request.getServletContext().getRealPath("/upload");
		//如果路径不存在,创建一个
		File realPath = new File(path);
		if (!realPath.exists()){
    
    
			realPath.mkdir();
		}
		System.out.println("上传文件保存地址:"+realPath);

		InputStream is = file.getInputStream(); //文件输入流
		OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流

		//读取写出
		int len=0;
		byte[] buffer = new byte[1024];
		while ((len=is.read(buffer))!=-1){
    
    
			os.write(buffer,0,len);
			os.flush();
		}
		os.close();
		is.close();
		return "redirect:/index.jsp";
	}
}

5. Configure tomcat and start the test.

Browser page:
Insert picture description here
Check whether the file is uploaded locally:
Insert picture description here

Method Two:

Use file.Transto to save uploaded files

The above environment must be equipped:

1. Write Controller

package com.lzcu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

/**
 * Created by wangshilin on 2020/2/27
 */
@Controller
public class FileController02 {
    
    
	/*
	 * 采用file.Transto 来保存上传的文件
	 */
	@RequestMapping("/upload2")
	public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
    
    

		//上传路径保存设置
		String path = request.getServletContext().getRealPath("/upload");
		File realPath = new File(path);
		if (!realPath.exists()){
    
    
			realPath.mkdir();
		}
		//上传文件地址
		System.out.println("上传文件保存地址:"+realPath);

		//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
		file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));

		return "redirect:/index.jsp";
	}
}

2. Change the front-end page request

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/upload2" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit" value="upload">
  </form>
  </body>
</html>

3. Start the test.

Browser:
Insert picture description here
Local authentication:
Insert picture description here

2. File download

0. Preparation

  • The environment is the same as above
  • Store a photo in the upload directory: hello.png

1. Write Controller

package com.lzcu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * Created by wangshilin on 2020/2/27
 */
@RestController
public class FileDownController {
    
    
	@RequestMapping(value="/download")
	public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
    
    
		//要下载的图片地址
		String  path = request.getServletContext().getRealPath("/upload");
		String  fileName = "hello.png";

		//1、设置response 响应头
		response.reset(); //设置页面不缓存,清空buffer
		response.setCharacterEncoding("UTF-8"); //字符编码
		response.setContentType("multipart/form-data"); //二进制传输数据
		//设置响应头
		response.setHeader("Content-Disposition",
				"attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));

		File file = new File(path,fileName);
		//2、 读取文件--输入流
		InputStream input=new FileInputStream(file);
		//3、 写出文件--输出流
		OutputStream out = response.getOutputStream();

		byte[] buff =new byte[1024];
		int index=0;
		//4、执行 写出操作
		while((index= input.read(buff))!= -1){
    
    
			out.write(buff, 0, index);
			out.flush();
		}
		out.close();
		input.close();
		return null;
	}
}

2. Modify the front-end page: index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/upload2" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit" value="upload">

    <a href="/download">点击下载</a>
  </form>
  </body>
</html>

3. Configure tomcat and test. ok

Insert picture description here

Guess you like

Origin blog.csdn.net/qq_37955704/article/details/104537898