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