springboot项目实现文件的上传显示和下载
程序员文章站
2022-06-02 14:09:29
...
文件上传:
HTML上传页面代码:
<input type="file" class="form-control" name="file">
submit提交到controller,controller中的代码:
@RequestMapping(value = "/usershare", method = RequestMethod.POST)
public String share(Model model, HttpServletRequest request,@RequestParam("file") MultipartFile file) {
HttpSession session = request.getSession();
String username = (String) session.getAttribute("sessusername");
System.out.println("用户名:"+username);
String title = request.getParameter("title");
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
// String filePath = request.getSession().getServletContext().getRealPath("fileupload/");
String filePath = "D:\\fileupload\\";//固定保存路径
File fileP = new File(filePath);
try {
userService.share(username, title, file.getBytes(), filePath, fileName);
} catch (Exception e) {
e.printStackTrace();
}
return "/share/share.html";
}
DAO中的具体保存代码:
public void share(String username, String title, byte[] file, String filePath, String fileName) {
//判断上传文件的保存目录是否存在
File targetFile = new File(filePath);
if(!targetFile.exists() && !targetFile.isDirectory()){
System.out.println(filePath+" 目录不存在,需要创建");
//创建目录
targetFile.mkdirs();
}
FileOutputStream out = null;
try {
out = new FileOutputStream(filePath+fileName);
out.write(file);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这样就将文件通过文件流写入到了本地文件夹中。
显示文件和下载:
将文件名字从数据库中取出来呈现到前台页面上,然后点击下载时传递文件名,通过文件名找到在固定目录中的文件,然后通过文件流下载。
前端显示代码:
<div th:if="${not #lists.isEmpty(list)}">
<table>
<tr>
<td width="115" height="37">标题</td>
<td width="115" height="37">内容</td>
<td width="132">发表时间</td>
<td width="180">发表用户</td>
<td width="100">操作</td>
</tr>
<tr th:each="diary:${list}">
<td th:text="${diary.title}"></td>
<td th:text="${diary.fileName}"></td>
<td th:text="${diary.writeTime}"></td>
<td th:text="${diary.username}"></td>
<td><button class="btn btn-small btn-link" type="button" th:onclick="'javascript:download(\''+${diary.fileName}+'\')'">下载</button></td>
</tr>
</table>
</div>
点击下载后通过JS函数传递到controller中,具体传递过程在这篇博客中。
controller代码:
@RequestMapping(value = "/download", method = RequestMethod.POST)
public void download(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
//得到要下载的文件名
String fileName = URLDecoder.decode(request.getParameter("diarycontent"),"utf-8");
//fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
//上传的文件都是保存在D:\fileupload\目录下的子目录当中
String fileSaveRootPath="D:\\fileupload\\";
System.out.println(URLDecoder.decode(request.getParameter("diarycontent"),"utf-8"));
//通过文件名找出文件的所在目录
//String path = findFileSavePathByFileName(fileName,fileSaveRootPath);
//String path = fileSaveRootPath;
//得到要下载的文件
File file = new File(fileSaveRootPath + "\\" + fileName);
//如果文件不存在
if(!file.exists()){
request.setAttribute("message", "您要下载的资源已被删除!!");
}
//处理文件名
String realname = fileName.substring(fileName.indexOf("_")+1);
//设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}
//关闭文件输入流
in.close();
//关闭输出流
out.close();
}
完成。推荐阅读
-
使用Python操作FTP实现上传和下载的方法
-
基于Maya API和PySide2的插件开发(用TextBrowser实现文件信息的显示)
-
php下连接ftp实现文件的上传、下载、删除文件实例代码
-
Spring MVC 实现文件的上传和下载
-
python实现去除下载电影和电视剧文件名中的多余字符的方法
-
SpringBoot 文件上传和下载的实现源码
-
WebApi实现单个文件的上传下载
-
【CLI】利用Curl下载文件实时进度条显示的实现
-
结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
-
SpringBoot实现本地存储文件上传及提供HTTP访问服务的方法