实现类似百度网盘上传的功能

今天写到了上传文件部分,记录一下。

前端使用了dropzone.js(用于实现文件上传的JS库),并对此文件进行了细微修改。

说一下思路吧:

首先界面长这样:

5679451-1f83f1ed16d6b875.png

点击上传文件,需要弹出一个对话框,对话框中有支持拖拽文件的文件选择框。

5679451-824f86bb8c00f195.png

注意,此时上传按钮是禁用的。

选择完成后,会有上传进度条。这里为了看到进度条,我选择上传一个比较大的文件。


5679451-5039a6aa6faa8793.png

进度条走满之后才可以点击上传按钮。点击上传刷新界面:


5679451-548caeb8c2faf168.png
5679451-723f77cc88d44ca1.png

可以看到上传成功了。

接下来说一下实现吧:

一、dropzone的文件上传表单

        <div class="modal fade" id="upload-dialog">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">
                            <span aria-hidden="true">×</span><span class="sr-only">Close</span>
                        </button>
                        <h4 class="modal-title">选择您需要上传的文件,可以拖拽</h4>
                    </div>
                    <div class="modal-body">
                        <form action="<%=basePath%>/doc/uploadfile.do?"
                            id="uploadfileform"  class="dropzone"
                            enctype="multipart/form-data">

                            <!-- <input type="file" name="file" id="btn_file" multiple> -->
                             
                        </form>
                        <!--style="display: none"  -->
                    </div>
                    <div class="modal-footer">
                        <!-- <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> -->
                        <button type="button" class="btn btn-default" onclick="closeUploadFileDialog()"> 关闭</button>
                        <button type="button" class="btn btn-default disabled" id ="submitbutton">上传</button>
                        
                    </div>
                </div>
                <!-- /.modal-content -->
            </div>
            <!-- /.modal-dialog -->
        </div>

核心就是引入dropzone.js后。添加一个表单标签,设置class="dropzone"。然后dropzone会自动检测到,并做大量的工作。

这里我修改了一下dropzone.js的几行代码。来满足我的需求。

主要是processing和success两个事件。processing表示正在上传的事件,success表示上传成功。可以看到这里当在上传的时候,我让按钮变成不能点击的状态。上传成功后,根据服务器返回的消息Message,把按钮变回可点击状态,然后添加点击函数,让界面重新加载。

5679451-e3ef9fd4559c5199.png
5679451-39128ea567cf937a.png

二、SpringMVC后台实现

有些请求参数是我业务需求,不用在意,主要是看获得文件保存路径,和file.transferTo(newFile);

在controller中使用MultipartFile file 来接受前端传过来的文件,使用file对象可以获得这个文件的一些属性,比如文件名,文件大小等等。

    @RequestMapping(value = "uploadfile.do", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Integer> uploadfile(HttpServletRequest request, @RequestParam("parentID") String parentID,
            @RequestParam("file") MultipartFile file, @RequestParam("team_id") String teamID) {

        String folderName = teamID;
        String filePath = FileStorage.getFileRealPath() + folderName;
        File parentPath = new File(filePath);

        if (!parentPath.exists()) {
            parentPath.mkdirs();
        }

        String realpath = parentPath + "\\" + file.getOriginalFilename();
        Long filesize = file.getSize();
        String fileOwner = ((User) request.getSession().getAttribute("user")).getUsername();
        Date now = new Date();
        File newFile = new File(realpath);
        try {
            file.transferTo(newFile);
            int uploadFiles = fileService.uploadFiles(file.getOriginalFilename(), fileOwner, filesize, now, 1, teamID,
                    realpath, parentID);
            System.out.println(uploadFiles);
            Map<String, Integer> resultmap = new HashMap<String, Integer>();
            resultmap.put("msg", uploadFiles);
            return resultmap;
        } catch (Exception e) {
            e.printStackTrace();
            Map<String, Integer> resultmap = new HashMap<String, Integer>();
            resultmap.put("msg", 0);
            return resultmap;
        }
    }

三、数据库

至于数据库的部分,有两点需要做:
①:在文件实体表插入文件的信息
②:在文件关系表中插入此文件与父文件的关系。
这个我在Service层实现的,就不贴出来了。知道要做这两件事就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叹了口丶气

觉得有收获就支持一下吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值