当前位置: 首页 > news >正文

dw5做简单的企业网站数据分析方法

dw5做简单的企业网站,数据分析方法,互联网保险发展现状和趋势,模板网站建设源码基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了,但是我是自己改造封装了一下,再次迈向全栈…

基于若依实现文件上传、下载

文章目录

  • 基于若依实现文件上传、下载
    • 1、前端实现-文件上传
      • 1.1 通用上传分析
      • 1.2 修改实现上传接口
    • 2、后端实现-文件上传
    • 3、后端实现-文件下载
    • 4、前端实现-文件下载

官网其实也写了,但是我是自己改造封装了一下,再次迈向全栈的一小步。下面是官网前后端分离版本文件上传的地址:

若依官方文档

1、前端实现-文件上传

1.1 通用上传分析

首先我这里有一个书籍列表的基础页面,我在它的修改这一栏加上了文件上传,这里前端其实就是用了若依封装的一个全局文件上传的组件,如果想看它的底层逻辑可以直接main.js,我这里就直接用了(但是后来发现全局组件不能行,还得自己封装elemntui的组件upload,这里只是先分析逻辑)

注意这里只是先分析,实现还在后面,因为若依自带的通用文件上传我们不能调用自己的上传接口,保存文件信息到数据库
在这里插入图片描述
这里就是找到对应的修改的dialog对话框中的form加上全局组件 <file-upload v-model="form.file"/>就可以了

    <!-- 添加或修改对话框 --><el-dialog :title="title" :visible.sync="open" width="500px" append-to-body><el-form ref="form" :model="form" :rules="rules" label-width="80px"><!--这里其他不重要的字段只列举了一部分--><el-form-item label="图书类型" prop="bookType"><el-select v-model="form.bookType" placeholder="请选择图书类型"><el-option label="名著" value="1"></el-option><el-option label="历史" value="2"></el-option><el-option label="社科" value="3"></el-option></el-select></el-form-item><el-form-item label="出版日期" prop="publishDate"><el-date-picker clearablev-model="form.publishDate"type="date"value-format="yyyy-MM-dd"placeholder="请选择出版日期"></el-date-picker></el-form-item><!--文件上传字段--><el-form-item label="上传文件" prop="file"><file-upload v-model="form.file"/></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog>

然后我们在修改对话框中点击上传文件,就会发现它直接调用了后端通用的上传文件的接口,已经把文件上传到了服务器,并且返回了上传后的地址
在这里插入图片描述

  /*** 通用上传请求(单个)*/@PostMapping("/upload")public AjaxResult uploadFile(MultipartFile file) throws Exception{try{// 上传文件路径 ,已在配置文件配置D:/ruoyi/uploadPathString filePath = RuoYiConfig.getUploadPath();// 上传并返回新文件名称 这里其实就在电脑配置的地址 根据年月日可以看文件了String fileName = FileUploadUtils.upload(filePath, file);String url = serverConfig.getUrl() + fileName;AjaxResult ajax = AjaxResult.success();ajax.put("url", url);ajax.put("fileName", fileName);ajax.put("newFileName", FileUtils.getName(fileName));ajax.put("originalFilename", file.getOriginalFilename());return ajax;}catch (Exception e){return AjaxResult.error(e.getMessage());}}

在这里插入图片描述

上面就是FileUploadUtils.upload(filePath, file);上传后的文件,下面是通用上传接口返回的响应,自己可以先看清楚,对于这个新的文件名称fileName 其实就是去掉了前缀的配置地址然后加上了一个profile,这个是为了隐藏我们真实的配置的文件路径,把配置的地址映射为了profile

但是这里其实可能不是我们想要的,**因为我们想调用我们自己的上传接口,这样我们后端还可以对文件进行处理,比如拿到文件后缀,把文件存入数据库对应的字段等。

1.2 修改实现上传接口

所以我们只能自己基于elemntui 去做修改,这里我想上传成功后还要返显文件名称

在列表的form加一个文件名称字段,

 <el-table-column label="文件名称" align="center" prop="fileName" />

首先对新增和修改的dialog做修改

 <!-- 添加或修改对话框 --><el-dialog :title="title" :visible.sync="open" width="500px" append-to-body><el-form ref="form" :model="form" :rules="rules" label-width="80px"><!--其他字段就省略了--><!--文件上传字段--><el-form-item label="上传文件" ><!--这里上传成功后会绑定文件名到form.fileName字段传给后端的新增接口,uploadBookFile定义上传请求, :before-upload是上传前的回调,用于文件格式校验 --><el-uploadclass="upload-demo"action="#":http-request="uploadBookFile":drag="true":before-upload="uploadFileFun":headers="upload.headers":file-list="form.fileList"><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip fontSize12 colorRed" slot="tip">上传文件格式为word或pdf或者txt,文件大小在2M以内</div></el-upload></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog>

data 数据

      upload: {// 设置上传的请求头部headers: { Authorization: "Bearer " + getToken() },},// 表单参数form: {},

javaScript方法

import { uploadBookFile} from "@/api/system/book";//下面是method写在里面的,  这里就是上传功能向后端发送上传请求,参数是一个二进制文件uploadBookFile(file){console.log(file.file,151454)// 创建formdata实例let formData = new window.FormData();// 将获取的文件通过append方法加入实例中formData.append("file", file.file);//发送axios请求uploadBookFile(formData).then(res => {console.log(res)//拿到后端响应的文件名称反显到列表的formthis.form.fileName = res.originalFilename})},//文件上传前的校验uploadFileFun(file){var test = /(doc|docx|pdf|txt)$/.test(file.name.split('.').pop().toLowerCase());if (!test) {this.$message.error("请上传正确的文档格式!");return false;}const isLt2M = file.size / 1024 / 1024 < 2;if (!isLt2M) {this.$message.error("上传文件大小不能超过 2MB!");return false;}},/** 提交按钮 */submitForm() {this.$refs["form"].validate(valid => {if (valid) {if (this.form.id != null) {updateBook(this.form).then(response => {this.$modal.msgSuccess("修改成功");this.open = false;this.getList();});} else {addBook(this.form).then(response => {this.$modal.msgSuccess("新增成功");this.open = false;this.getList();});}}});},

api/book.js

import { getToken } from "@/utils/auth";
// 上传文件
export function uploadBookFile(data) {return request({url: '/system/book/uploadFile',method: 'post',data: data,headers: {'Content-Type': 'multipart/form-data','Authorization': "Bearer " + getToken(),}})
}

2、后端实现-文件上传

后端其实就比较简单了,我也没做一个专门的文件表,只是在业务表里面加了一个file_name字段,表结构如下**(这里只是做文件上传,所以不需要文件路径字段,后续做文件下载就必须要文件路径字段,后面我会再修改)**

在这里插入图片描述

controller 这里是前端的upload组件传过来了一个二进制文件,然后后端把文件上传到服务器,并把文件名也返回给了前端,这样前端就可以对响应结果做解析,把文件名字段绑定到新增、修改的dialog里面,然后点击保存再把文件名称字段传回后端保存到数据库。

/*** 上传文件接口* @param file* @return* @throws Exception*/@PostMapping("/uploadFile")public AjaxResult uploadFile(MultipartFile file) throws Exception{try{// 上传文件路径 ,已在配置文件配置D:/ruoyi/uploadPathString filePath = RuoYiConfig.getUploadPath();// 上传并返回新文件名称 . "fileName": "/profile/upload/2024/07/06/紫金项目_20240706155317A001.txt",String fileName = FileUploadUtils.upload(filePath, file);String url = serverConfig.getUrl() + fileName;//这些信息返回给前端之后,AjaxResult ajax = AjaxResult.success();ajax.put("url", url);ajax.put("fileName", fileName);//    "newFileName": "紫金项目_20240706155317A001.txt",ajax.put("newFileName", FileUtils.getName(fileName));// "originalFilename": "紫金项目.txt",用于给前端列表回显ajax.put("originalFilename", file.getOriginalFilename());return ajax;}catch (Exception e){return AjaxResult.error(e.getMessage());}}/*** 新增接口就是代码生成的看的,前端点击保存按钮的时候会读取Book实体类的fileName字段再保存到数据库*/@PreAuthorize("@ss.hasPermi('system:book:add')")@Log(title = "新增", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Book book){return toAjax(bookService.insertBook(book));}

3、后端实现-文件下载

由于实现文件下载,所以必不可少的就是文件路径这个字段,所以我们还得加上文件路径这个字段,所以现在表结构如下,还得给所有的增删改查字段加上文件路径这个字段

在这里插入图片描述

其他的直接使用通用的文件下载接口就可以了 ,前端传一个文件路径回来,后端就可以直接下载了

前端需要传的文件路径是这样的 /profile/upload/2024/07/06/紫金项目_20240706160309A002.txt

首先前端经过代理proxy之后就会拿到ip和端口,然后后端这时候有个拦截器,它会拦截/profile,拦截之后把它再替换成配置文件中配置的绝对路径。

在这里插入图片描述

4、前端实现-文件下载

首先修改文件上传方法,加入一行 this.form.filePath = res.fileName,这样上传后,把文件路径绑定到了西新增修改的dialong,在点击保存的时候,就可以把文件路径存入数据库。后续列表查询就可以读取到当前行的文件路径了。

    uploadBookFile(file){console.log(file.file,151454)// 创建formdata实例let formData = new window.FormData();// 将获取的文件通过append方法加入实例中formData.append("file", file.file);uploadBookFile(formData).then(res => {console.log(res)// 保存到新增、修改的form里面再入数据库this.form.fileName = res.originalFilenamethis.form.filePath = res.fileName})},

加上下载按钮

 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"><template slot-scope="scope"><el-buttonsize="mini"type="text"icon="el-icon-edit"@click="handleUpdate(scope.row)"v-hasPermi="['system:book:edit']">修改</el-button><el-buttonsize="mini"type="text"icon="el-icon-delete"@click="handleDelete(scope.row)"v-hasPermi="['system:book:remove']">删除</el-button><el-buttonsize="mini"type="text"icon="el-icon-edit"@click="handleDownload(scope.row)">下载</el-button></template></el-table-column>

在method里面加上如下方法,这里就是直接调用了通用的文件下载,这里的filePanth就是前面保存的/profile/upload/2024/07/06/紫金项目_20240706160309A002.txt

    handleDownload(row){var name = row.fileName;var url = row.filePath;this.$download.resource(url,false)}

最后值得注意的是我目前实现的都是单文件上传和下载,多文件我后续会继续写demo


文章转载自:
http://pachouli.jftL.cn
http://subscapular.jftL.cn
http://penguin.jftL.cn
http://nonscience.jftL.cn
http://lentiginose.jftL.cn
http://cut.jftL.cn
http://eh.jftL.cn
http://fibrocement.jftL.cn
http://cstar.jftL.cn
http://slump.jftL.cn
http://lallan.jftL.cn
http://parlay.jftL.cn
http://aesculapius.jftL.cn
http://acantha.jftL.cn
http://laager.jftL.cn
http://backswept.jftL.cn
http://highfaluting.jftL.cn
http://batangas.jftL.cn
http://camphene.jftL.cn
http://counterboy.jftL.cn
http://dieter.jftL.cn
http://appreciative.jftL.cn
http://affective.jftL.cn
http://stronger.jftL.cn
http://goldminer.jftL.cn
http://arkansan.jftL.cn
http://morphia.jftL.cn
http://oceanologist.jftL.cn
http://meliorate.jftL.cn
http://carecloth.jftL.cn
http://homily.jftL.cn
http://microtransmitter.jftL.cn
http://ascu.jftL.cn
http://hateable.jftL.cn
http://slather.jftL.cn
http://stardom.jftL.cn
http://normanize.jftL.cn
http://discrepancy.jftL.cn
http://scrubby.jftL.cn
http://sony.jftL.cn
http://phlebolith.jftL.cn
http://leman.jftL.cn
http://berliozian.jftL.cn
http://lobule.jftL.cn
http://sad.jftL.cn
http://concise.jftL.cn
http://figurehead.jftL.cn
http://computerese.jftL.cn
http://toffee.jftL.cn
http://nondirectional.jftL.cn
http://dazzle.jftL.cn
http://cordially.jftL.cn
http://rebus.jftL.cn
http://undulatory.jftL.cn
http://visualizer.jftL.cn
http://aegrotat.jftL.cn
http://connected.jftL.cn
http://kapok.jftL.cn
http://damfool.jftL.cn
http://econometric.jftL.cn
http://nonius.jftL.cn
http://caltrap.jftL.cn
http://horologii.jftL.cn
http://hydranth.jftL.cn
http://antiseismic.jftL.cn
http://cemental.jftL.cn
http://gullibility.jftL.cn
http://condignly.jftL.cn
http://shortening.jftL.cn
http://corbie.jftL.cn
http://nonhuman.jftL.cn
http://deipnosophist.jftL.cn
http://dulocracy.jftL.cn
http://underset.jftL.cn
http://moxa.jftL.cn
http://euclid.jftL.cn
http://homologize.jftL.cn
http://epitheliomatous.jftL.cn
http://sorgo.jftL.cn
http://gct.jftL.cn
http://tervueren.jftL.cn
http://evacuee.jftL.cn
http://iad.jftL.cn
http://computerize.jftL.cn
http://merlin.jftL.cn
http://obstinate.jftL.cn
http://inconsiderably.jftL.cn
http://tutenag.jftL.cn
http://wavelet.jftL.cn
http://drosky.jftL.cn
http://semimanufactures.jftL.cn
http://warp.jftL.cn
http://ibid.jftL.cn
http://porny.jftL.cn
http://pair.jftL.cn
http://telosyndesis.jftL.cn
http://glycemia.jftL.cn
http://toluca.jftL.cn
http://swordplay.jftL.cn
http://sacristan.jftL.cn
http://www.dt0577.cn/news/82976.html

相关文章:

  • 做视频可以赚钱的网站百度推广服务
  • 针对网站做搜索引擎做优化百度网站推广申请
  • 正常成都建设网站深圳华强北最新消息
  • 网页设计素材主题搜索引擎优化不包括
  • 导航网站建站系统网上国网app推广
  • 网站建设的报价为什么不同sem对seo的影响有哪些
  • 淘宝客网站主题百家号关键词排名
  • 广告图片素材北京网站优化
  • 网站建设的三网合一seo 优化技术难度大吗
  • 福建八大员建设厅延续的网站登封网络推广
  • 网站开发合同 保密条款流量平台排名
  • 外贸企业网站建设软文推广案例
  • 创意网名昵称大全郑州专业seo首选
  • vps网站搬家上海搜索优化推广哪家强
  • 网站在线客服管理系统爱战网关键词挖掘查询工具
  • 网站开发后台今日广东头条新闻
  • 海城seo网站排名优化推广app营销模式有哪些
  • 怎么做网站可手机看seo刷排名公司
  • 商城网站建设那家好新闻 近期大事件
  • 上海设计公司名称大全太原seo关键词排名
  • b2c网站运营方案seo诊断优化方案
  • 做门面商铺比较好的网站营销方案100个软文
  • 农产品网站建设策划百度号码认证平台首页
  • wordpress 手机应用惠州seo优化
  • php 做网站 python项目推广
  • 网站建设电商互联网广告价格
  • 做网站卖产品要注册公司吗如何开网站呢
  • 网站客服模版百度站长工具seo综合查询
  • 河南省住建局官方网站磁力链
  • 公司怎么注册自己的网站旅游景区网络营销案例