Spring MVC 处理form表单 上传文件2--实现

 1.JSP文件中 编写form标签 上传文件 

          修改<form>标签 将enctype属性设置为multipart/form-data,这会告诉浏览器以multipart数据的形式提交表单,而不是以表单数据的形式进行提交

           <input>域,其type为file。这能够让用户选择要上传的图片文件。name属性,和controller方法里的参数名保持一致。accept属性用来将文件类型限制为JPEG、PNG以及GIF图片。accept属性可以省略。
 

<form action="register" method="POST" enctype="multipart/form-data">
      First Name: <input type="text" name="firstName" /><br/>
   
      File: <input type="file" accept="image/jepg,image/png"
                name="file">
      <input type="submit" value="Register" />
</form>

2.理解MultipartFile接口

        使用SpringMVC的MultipartFile接口来处理 处理multipart请求数据  MultipartFile的接口提供的功能如下

package org.springframework.web.multipart;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.core.io.InputStreamSource;
 
public interface MultipartFile extends InputStreamSource {
	
	String getName(); 
	String getOriginalFilename();           //获取原始的文件名
	String getContentType();                //获取内容类型
	boolean isEmpty();                      //文件是否为空
	long getSize();                         //获取文件大小
	byte[] getBytes() throws IOException;   //获取上传文件byte
	@Override
	InputStream getInputStream() throws IOException;	//将文件数据以流的方式进行读取
        //将上传的文件写入到文件系统中
	void transferTo(File dest) throws IOException, IllegalStateException;
 
}

3.编写控制器方法来接收上传的文件

         使用MultipartFile类保存上传的文件有3种方法 分别是 transferTo()方法 getBytes()方法 和getInputStream()方法

import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
 
@Controller
@RequestMapping("/spitter")
public class SpitterController {
 
	@RequestMapping("/register")
	public String register(Spitter spitter, MultipartFile file, Model model) throws IllegalStateException, IOException {
		// 处理实体类spitter,省略
 
		 saveFileByTransferTo(file); // 使用MultipartFile的transferTo()方法 保存文件
		 saveFileByGetBytes(file);
		 saveFileByGetInputStream(file);
		return "profile";
	}
 
}

3.1使用 MultipartFile类transferTo()方法保存上传的文件。最简单好用,就一句代码。

    这个要保证test1文件夹存在,而且文件名不能有中文 

import java.io.File;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
 
public class SpitterController {
   public void saveFileByTransferTo(MultipartFile file) throws IllegalStateException, IOException {
	file.transferTo(new File("/test1/" + file.getOriginalFilename()));
   }
}
 

 3.2使用 MultipartFile类getBytes()方法保存上传的文件

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
 
public class SpitterController {
	public void saveFileByGetBytes(MultipartFile file) throws IOException {
		/* 第1步创建文件夹 */
		String basePath = "D:/Program/apache-tomcat-8.5.32-windows-x64/apache-tomcat-8.5.32/work/Catalina/localhost/spittr/uploads";
		String fullFolderPath = basePath + File.separator + "test2"; // 文件夹全路径
		File outFolder = new File(fullFolderPath); // 根据文件夹全路径判断,如果文件夹不存在,创建文件夹
		if (!outFolder.exists()) {
			outFolder.mkdirs();
		}
		/* 第2步:创建文件 */
		String fullFilePath = fullFolderPath + File.separator + file.getOriginalFilename(); // 文件全路径
		File outFile = new File(fullFilePath);
		if (!outFile.exists()) {// 如果文件不存在,创建文件
			outFile.createNewFile();
		}
		/* 第3步:根据空文件,创建字符流的目的地(输出流) */
		BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(outFile)); // 创建文件输出流
 
		/* 第4步:根据上传的文件,创建缓冲区,生成字符流,存入缓冲区 */
		byte[] buffer = file.getBytes();// 创建文件流
 
		/* 第5步:把缓冲区的字符流 写入 字符流目的地(把输入流写入输出流) */
		stream.write(buffer);
 
		/* 第6步:刷新流,关闭流 */
		stream.close();
 
	}
}

3.3使用 MultipartFile类getInputStream()方法保存上传的文件 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.web.multipart.MultipartFile;
 
public class SpitterController {
	public void saveFileByGetInputStream(MultipartFile file) throws IOException {
		/* 第1步创建文件夹 */
		String basePath = "D:/Program/apache-tomcat-8.5.32-windows-x64/apache-tomcat-8.5.32/work/Catalina/localhost/spittr/uploads";
		String fullFolderPath = basePath + File.separator + "test3"; // 文件夹全路径
		File outFolder = new File(fullFolderPath);
		if (!outFolder.exists()) {
			outFolder.mkdirs();
		}
		/* 第2步:创建文件 */
		String fullFilePath = fullFolderPath + File.separator + file.getOriginalFilename(); // 文件全路径
		File outFile = new File(fullFilePath);
		if (!outFile.exists()) {// 如果文件不存在,创建文件
			outFile.createNewFile();
		}
 
		/* 第3步:根据空文件,创建字符流的目的地(输出流) */
		BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(outFile)); // 创建文件输出流
 
		/* 第4步:获取输入流 */
		InputStream iStream = file.getInputStream();
		BufferedInputStream biStream = new BufferedInputStream(iStream);
		/* 第5步:把输入流写入输出流 */
		int f;
		while ((f = biStream.read()) != -1) {
			outStream.write(f);
		}
		/* 第6步:刷新流,关闭流 */
		outStream.flush();
		outStream.close();
		biStream.close();
		iStream.close();
 
	}
}

java InputStream 和 OutputStream的理解 参考java InputStream 和 OutputStream 

 

posted on 2019-08-03 14:02  dreamstar  阅读(400)  评论(0编辑  收藏  举报