欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>

springboot项目实现文件的上传显示和下载

点击下载后通过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();
    }
完成。