文件上传
在application.properties 中配置 上传文件限定大小
#上传下载
#最大文件大小。值可以使用后缀“MB”或“KB”。指示兆字节或千字节大小。
spring.servlet.multipart.max-file-size=10MB
# 最大请求大小可以是mb也可以是kb
spring.servlet.multipart.max-request-size=10MB
接着可以写前台页面 注意上传的form 表单要写属性 enctype="multipart/form-data"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<h2>上传文件</h2>
<form action="/file/upload" method="post" enctype="multipart/form-data" >
<input type="file" name="myfile"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
编写后台代码 新建FileController 来处理文件的上传下载请求 使用 MultipartFile 来接收文件
并使用MultipartFile的transferTo(File file)方法将前台文件存入服务器
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
// @RestController 是 @responsebody和@controller两个标签的合体
@RestController
//窄化路径
@RequestMapping(value = "/file")
public class FileController {
//传统springmvc上传方式 需要使用spring mvc 的jar
@RequestMapping("upload")
@ResponseBody
public String getfile(@RequestParam("myfile") MultipartFile file){
System.out.println("file name = "+file.getOriginalFilename());
// 获取文件名
String fileName = file.getOriginalFilename();
// 获取后缀
String suffixName = fileName.substring(fileName.lastIndexOf("."));
// 文件上传的路径
String filePath = "E:\\codeworkspaces\\uploadspace\\20190410\\";
// fileName处理
fileName = filePath+ UUID.randomUUID()+fileName;
// 文件对象
File dest = new File(fileName);
// 创建路径
if(!dest.getParentFile().exists()){
dest.getParentFile().mkdir();
}
try {
//保存文件
file.transferTo(dest);
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败";
}
}
上传文件
上传成功
如果将上传大小限制为1M 我们上传1.5M文件会提示如下错误
文件下载
变写前台页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h1>文件下载</h1>
<a href="/file/download">Delphine Mantoulet - Java.mp3 音乐下载</a>
</body>
</html>
利用io流将 服务器端文件 通过response 写到客户端对应位置
@RequestMapping("download")
public void download(HttpServletResponse response) throws FileNotFoundException {
File file =new File("E:\\codeworkspaces\\downloadspace\\Delphine Mantoulet - Java.mp3");
FileInputStream fileInputStream=new FileInputStream(file);
// 设置被下载而不是被打开
response.setContentType("application/gorce-download");
// Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
response.addHeader("Content-disposition","attachment;fileName=Delphine Mantoulet - Java.mp3");
try {
OutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
利用nio 实现文件下载
前台
<h1>文件下载2</h1>
<a href="/file/niodownload">Delphine Mantoulet - Java.mp3 音乐nio下载</a>
</body>
controller编写
@RequestMapping("niodownload")
public void download2(HttpServletResponse response) throws FileNotFoundException {
File file =new File("E:\\codeworkspaces\\downloadspace\\Delphine Mantoulet - Java.mp3");
FileInputStream fileInputStream=new FileInputStream(file);
// 设置被下载而不是被打开
response.setContentType("application/gorce-download");
//Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
response.addHeader("Content-disposition","attachment;fileName=Delphine Mantoulet - Java.mp3");
//NIO 实现
int bufferSize = 1024*1024*2;
FileChannel fileChannel = fileInputStream.getChannel();
// 6x128 KB = 768KB byte buffer
ByteBuffer buff = ByteBuffer.allocateDirect(1024*1024*4);
byte[] byteArr = new byte[bufferSize];
int nRead, nGet;
try {
while ((nRead = fileChannel.read(buff)) != -1) {
if (nRead == 0) {
continue;
}
buff.position(0);
buff.limit(nRead);
while (buff.hasRemaining()) {
nGet = Math.min(buff.remaining(), bufferSize);
// read bytes from disk
buff.get(byteArr, 0, nGet);
// write bytes to output
response.getOutputStream().write(byteArr);
}
buff.clear();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
buff.clear();
// fileChannel.close();
// fileInputStream.close();
}
}