2022-07-23 上传文件2

https://blog.csdn.net/cradle2006/article/details/105448756


<a-form :form="form"> 

    <a-form-item label="名称" style="margin-bottom: 0;"> 

        <a-input v-decorator="['name', {rules: [{required: true, message: '请输入名称!'}]}]" /> 

    </a-form-item>

    <a-form-item> 

      <a-upload 

      :multiple="true" 

      :fileList="downloadFiles" 

      :remove="handleDownloadFileRemove" 

      :customRequest="downloadFilesCustomRequest" 

      > 

        <a-button class="upload-btn"> <a-icon type="upload" > 相关下载 </a-button> 

      </a-upload> 

    </a-form-item>

</a-form>


const dibootApi = {

    get (url, params) { 

      return axios.get(url, { 

        params 

      }) 

    }, 

    upload(url, formData) { 

      return service({ 

        url, 

        method: 'POST', 

        data: formData 

      }) 

    }

}

export default dibootApi


export default {

    name: 'demoForm',

    data () {

        title: '新建',                            // 该表单的功能标题

        form: this.$form.createForm(this),        // 表单数据初始化,没什么好说的

        model: {},                                // 如果是更新表单,之前的数据放到这里,来做数据初始化显示之用

        downloadFiles: []                        // 已经上传的文件列表

    },

    methods: {

        // 初始打开的表单时的处理(如果是更新表单,这里首先需要读取出相关数据)

        async open (id) { 

          if (id === undefined) { 

            // 没有id数据则认为是新建 

            this.model = {} 

            this.afterOpen() 

          } else { 

            // 否则作为更新处理 

            const res = await dibootApi.get(`/${this.name}/${id}`) 

            if (res.code === 0) { 

                this.model = res.data 

                this.title = '编辑' 

                this.afterOpen(id) 

            } else { 

                this.$notification.error({ 

                    message: '获取数据失败', 

                    description: res.msg 

                }) 

            } 

          } 

        },

        // 更新表单在读取数据完成后的操作

        afterOpen (id) { 

            // 获取该记录信息后,回显文件列表相关操作

            dibootApi.post(`/demo/getFiles/${id}`).then(res => { 

                if (res.code === 0){ 

                    if (res.data.downloadFile !== undefined){ 

                        res.data.downloadFile.forEach(data => { 

                            this.downloadFiles.push(this.fileFormatter(data)) 

                        }) 

                    }

                } 

            }) 

        },

        // 重写a-upload的文件上传处理方式

        downloadFilesCustomRequest (data) { 

            this.saveFile(data) 

        }, 

        // 上传并保存文件

        saveFile (data){ 

            const formData = new FormData() 

            formData.append('file', data.file) 

            dibootApi.upload('/demo/upload', formData).then((res) => { 

                if (res.code === 0){ 

                    let file = this.fileFormatter(res.data)

                    // 上传单个文件后,将该文件会先到a-upload组件的已上传文件列表中的操作

                    this.downloadFiles.push(file)

                } else { 

                    this.$message.error(res.msg) 

                } 

            }) 

        },

        // 对上传成功返回的数据进行格式化处理,格式化a-upload能显示在已上传列表中的格式(这个格式官方文档有给出的)

        fileFormatter(data) { 

            let file = { 

                uid: data.uuid,    // 文件唯一标识,建议设置为负数,防止和内部产生的 id 冲突 

                name: data.name,  // 文件名 

                status: 'done', // 状态有:uploading done error removed 

                response: '{"status": "success"}', // 服务端响应内容 

            } 

            return file 

        },

        // 没错,删除某个已上传的文件的时候,就是调用的这里

        handleDownloadFileRemove (file) { 

            const index = this.downloadFiles.indexOf(file) 

            const newFileList = this.downloadFiles.slice() 

            newFileList.splice(index, 1) 

            this.downloadFiles = newFileList 

        },

        // 表单校验就靠他了,不过这里面还是可以对需要提交的一些数据做些手脚的

        validate () { 

            return new Promise((resolve, reject) => { 

                this.form.validateFields((err, fieldsValue) => { 

                    if (!err) { 

                        // 设置上传文件列表 

                        const downloadFiles = this.downloadFiles.map(o => { 

                            return o.uid 

                        }) 

                        const values = { 

                            ...fieldsValue, 

                            'downloadFiles': downloadFiles

                        } 

                        resolve(values) 

                    } else { 

                        reject(err) 

                    }

                }) 

            }) 

        },

        // 表单提交的相关操作

        async onSubmit () { 

            const values = await this.validate() 

            try { 

                let result = {} 

                if (this.model.id === undefined) { 

                    // 新增该记录 

                    result = await this.add(values) 

                } else { 

                    // 更新该记录 

                    values['id'] = this.model.id 

                    result = await this.update(values) 

                } 

                // 执行提交成功的一系列后续操作 

                this.submitSuccess(result) 

            } catch (e) { 

                // 执行提交失败的一系列后续操作 

                this.submitFailed(e) 

            } 

        },

        // 新增数据的操作

        async add (values) {

            ....

        },

        // 更新数据的操作

        async update (values) {

            ...

        }

    }

}



/***

* 获取文件信息列表 

* @param id 

* @return 

* @throws Exception 

*/

@PostMapping("/getFiles/{id}") 

public JsonResult getFilesMap(@PathVariable("id") Serializable id) throws Exception{ 

    List<File> files = fileService.getEntityList( 

            Wrappers.<File>lambdaQuery() 

                    .eq(File::getRelObjType, Demo.class.getSimpleName()) 

                    .eq(File::getRelObjId, id) 

    ); 

    return new JsonResult(Status.OK, files); 

}

/*** 

* 上传文件 

* @param file 

* @param request 

* @return 

* @throws Exception 

*/

@PostMapping("/upload") 

public JsonResult upload(@RequestParam("file") MultipartFile file) throws Exception { 

    File fileEntity = demoService.uploadFile(file); 

    return new JsonResult(Status.OK, fileEntity, "上传文件成功"); 

}

/***

* 创建成功后的相关处理

* @param entity

* @return

*/

@Override

protected String afterCreated(BaseEntity entity) throws Exception {

    DemoDTO demoDTO = (DemoDTO) entity;

    // 更新文件关联信息

    demoService.updateFiles(new ArrayList<String>(){{

        addAll(demoDTO.getDownloadFiles());

    }}, demoDTO.getId(), true);

    return null;

}

/***

* 更新成功后的相关处理

* @param entity

* @return

*/

@Override

protected String afterUpdated(BaseEntity entity) throws Exception {

    DemoDTO demoDTO = (DemoDTO) entity;

    // 更新文件关联信息

    demoService.updateFiles(new ArrayList<String>(){{

        addAll(demoDTO.getDownloadFiles());

    }}, demoDTO.getId(), false);

    return null;

}



@Override

public File uploadFile(MultipartFile file) { 

    if(V.isEmpty(file)){ 

        throw new BusinessException(Status.FAIL_OPERATION, "请上传图片"); 

    } 

    String fileName = file.getOriginalFilename(); 

    String ext = fileName.substring(fileName.lastIndexOf(".")+1); 

    String newFileName = S.newUuid() + "." + ext; 

    //TODO: 需要对合法的文件类型进行验证 

    if(FileHelper.isImage(ext)){ 

        throw new BusinessException(Status.FAIL_OPERATION, "请上传合法的文件类型"); 

    }; 


    // 说明:此处为我们的处理流程,看官们需要根据自己的需求来对文件进行保存及处理(之后我们的File组件开源之后也可以按照此处的处理)

    String filePath = FileHelper.saveFile(file, newFileName); 

    if(V.isEmpty(filePath)){ 

        throw new BusinessException(Status.FAIL_OPERATION, "图片上传失败"); 

    } 


    File fileEntity = new File(); 

    fileEntity.setRelObjType(Demo.class.getSimpleName()); 

    fileEntity.setFileType(ext); 

    fileEntity.setName(fileName); 

    fileEntity.setPath(filePath); 

    String link = "/file/download/" + D.getYearMonth() + "_" + newFileName; 

    fileEntity.setLink(link); 


    boolean success = fileService.createEntity(fileEntity); 

    if (!success){ 

        throw new BusinessException(Status.FAIL_OPERATION, "上传文件失败"); 

    } 

    return fileEntity; 


@Override 

public void updateFiles(List<String> uuids, Long currentId, boolean isCreate) { 

    // 如果不是创建,需要删除不在列表中的file记录 

    if (!isCreate){ 

        fileService.deleteEntities(Wrappers.<File>lambdaQuery().notIn(File::getUuid, uuids)); 

    } 

    // 进行相关更新 

    boolean success = fileService.updateEntity( 

            Wrappers.<File>lambdaUpdate() 

                    .in(File::getUuid, uuids) 

                    .set(File::getRelObjType, Demo.class.getSimpleName()) 

                    .set(File::getRelObjId, currentId)); 

    if (!success){ 

        throw new BusinessException(Status.FAIL_OPERATION, "更新文件信息失败"); 

    } 

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容