SpringBoot如何实现文件上传和下载
程序员文章站
2022-04-30 23:06:02
...
文件上传
其实文件上传无非就是文件的读取和写入,明白这个道理之后就好办了。
前端页面
<form method="POST" action="/fileUpload" enctype="multipart/form-data">
<input type="file" id="myFile" name="myFile" /><br/>
<input type="submit" value="Submit" />
</form>
这里需要注意的就是表单的enctype属性值必须设置为multipart/form-data
。
后端Controller
public static final String FILEPATH="E://wunian/test.txt";
@PostMapping("/fileUpload")
public @ResponseBody String fileUpload(@RequestParam("myFile")MultipartFile file){
//判断文件是否为空
if(file.isEmpty()){
return "请不要上传空文件!";
}
try{
//获得文件的字节流
byte[] bytes=file.getBytes();
//获得文件保存的路径对象
Path path= Paths.get(FILEPATH+file.getOriginalFilename());
//将文件写入到目标路径中
Files.write(path,bytes);
return "文件上传成功!";
}catch (IOException e){
e.printStackTrace();
}
return "文件上传失败!";
}
从上面代码中可以看出,我们只需要将上传文件的类型定义成MultipartFile
对象即可传入,然后通过一些文件操作API读取文件数据再写入到目标路径即可。
文件下载
前端页面
<a href="/download">立即下载</a>
后端Controller
public static final String FILEPATH="E://wunian/test.txt";
@RequestMapping(value="/download",method = RequestMethod.GET)
public void download( HttpServletResponse response){
//下载文件名
String fileName="test.txt";
//通过文件的保存文件夹路径加上文件的名字来获得文件
File file=new File(FILEPATH,fileName);
if(file.exists()){ //判断文件是否存在
//设置响应的内容格式,force-download表示只要点击下载按钮就会自动下载文件
response.setContentType("application/force-download");
//设置头信息,filename表示前端下载时的文件名
response.addHeader("Content-Disposition",String.format("attachment; filename=\"%s\"", file.getName()));
//进行读写操作
byte[] buffer=new byte[1024];
FileInputStream fileInputStream=null;
BufferedInputStream bufferedInputStream=null;
try{
fileInputStream=new FileInputStream(file);
bufferedInputStream=new BufferedInputStream(fileInputStream);
//获取输出流
OutputStream os=response.getOutputStream();
//读取并且写入文件到输出流
int i=bufferedInputStream.read(buffer);
while(i!=-1){
os.write(buffer,0,i);
i=bufferedInputStream.read(buffer);
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭输入输出流
try {
if(bufferedInputStream!=null){
bis.close();
}
if(fileInputStream!=null){
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
从上面代码中可以看出,下载和上传一样,本质上也是流的输入输出,不过不同的是下载需要设置response的头信息和内容格式,而且头信息一般设置为Content-Disposition=attachment; filename=xxx
。
上一篇: ActiveMQ之三:启动ActiveMQ的Broker
下一篇: activeMQ之Queue