循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理
在我们一般系统中,往往都会涉及到附件的处理,有时候附件是图片文件,有时候是Excel、Word等文件,一般也就是可以分为图片附件和其他附件了,图片附件可以进行裁剪管理、多个图片上传管理,及图片预览操作,如果是其他附件,则只需上传和下载处理即可。本篇随笔基于ABP后端的接口整合,实现前后端的附件上传管理。
1、ABP后端附件管理接口
ABP框架是基于最新.net core 的技术方向,应用非常广泛的一个技术框架系列,它整合了很多.net core 领域相关开发技术,后端主要是发布Web API方式实现数据和前端的交互的,因此前端可以基于Web API基础上实现多种平台的对接,可以是常规的BS框架,如Vue+Element 前端路线,也可以是Winform/WPF的前端框架接入等。

ABP+Swagger UI 负责API接口的开发和公布,如下是附件上传模块的API接口的管理界面。

ABP框架后端接口的常规处理,如增删改查等接口命名都一致,参数方面也比较一致,而我们附件上传,则可以自定义一个自己喜欢名称的一个API接口名称,如这里定义一个PostUpload的方法,除了文件信息外,还包括一些参数来说明附件信息的。上传成功后,返回对应的路径集合。

ABP后端定义的接口实现,我们为了获得上下文对象的文件对象信息,我们在构造函数注入一个IHttpContextAccessor 对象。
/// <summary>
/// 上传附件信息,应用层服务接口实现
/// </summary>
[AbpAuthorize]
public class FileUploadAppService : MyAsyncServiceBase<FileUpload, FileUploadDto, string, FileUploadPagedDto, CreateFileUploadDto, FileUploadDto>, IFileUploadAppService
{
private AppConfig config = new AppConfig();
private readonly IRepository<FileUpload, string> _repository;//业务对象仓储对象
private readonly IRepository<User, long> _userRepository;//用户信息仓储对象
private IHttpContextAccessor _httpContext;//上下文对象 public FileUploadAppService(IRepository<FileUpload, string> repository, IRepository<User, long> userRepository, IHttpContextAccessor httpContext) : base(repository)
{
_repository = repository;
_userRepository = userRepository;
_httpContext = httpContext;
}
在附件上传处理的时候,我们就可以通过这样获得请求的文件对象了,如下代码所示。

在后端上传文件的时候,和我其他开发框架,如Winform框架、混合开发框架、BS等框架一样,我们后端为了方便,也可以使用FTP方式进行附件的上传(这里依旧是使用FluentFTP组件),如我们指定配置如下所示。


另外,在整合ABP后端接口的时候,我们为了方便,一般使用ES6的方式定义一个客户端的Api调用类,基础接口封装在BaseApi类里面,扩展自定义接口放在子类定义,如下所示。

另外,我们需要整合Api和界面部分实现完整的功能,那么需要提供两个部分:一个是Api类的继承子类,一个是视图界面的内容。如下所示包含Api封装类文件和Vue + Element界面视图。

2、前端附件管理的实现
上传图片或者其他附件信息,我们可以用Element组件里面的el-Upload组件操作,这个控件基本上能够满足大多数的应用了,参考地址:https://element.eleme.cn/#/zh-CN/component/upload。
如下是其中的界面使用代码:
<el-form-item label="封面图片">
<el-upload
ref="upload"
action="/abp/services/app/FileUpload/PostUpload"
list-type="picture-card"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:on-success="onSuccess"
:on-error="onError"
accept="image/jpeg,image/gif,image/png,image/bmp"
:headers="myHeaders"
:file-list="editForm.fileList"
>
<i class="el-icon-plus" />
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-form-item>
只是我们一般为了简化处理,往往使用一些基于El-Upload组件之上封装好的组件,更显方便而已。
一般的图片和附件上传界面如下所示。

如我往往喜欢喜欢使用稍加封装,代码量更少的一些第三方组件,如:
dream2023/vue-ele-upload-image
等这位仁兄的二次封装的组件来做附件管理,可以更加简洁一些。如下是使用的代码。
<el-row>
<el-col :span="24">
<el-form-item label="图片" prop="picture">
<ele-upload-image
v-model="editForm.picture"
:is-show-tip="false"
:size="100"
action="/abp/services/app/FileUpload/PostUpload"
title="封面图片"
:headers="myHeaders"
:data="{guid:editForm.id, folder:'用户图片'}"
:crop="true"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="资料文档" prop="attachGUID">
<ele-upload-file
v-model="editForm.attachGUID_files"
:response-fn="handleAttachResponse"
action="/abp/services/app/FileUpload/PostUpload"
:headers="myHeaders"
:data="{guid:editForm.attachGUID, folder:'用户图片'}"
:before-remove="beforeRemoveAttach"
/>
</el-form-item>
</el-col>
编辑界面下,附件上传界面,可以加载已有的记录展示,如下所示。

而附件列表我们通过调用ABP后端API即可获取,然后进行绑定即可。
// 获取附件文件列表
param = { guid: this.editForm.attachGUID }
fileupload.GetByAttachGUID(param).then(data => {
if (data.result) {
this.editForm.attachGUID_files = [...data.result]
}
})
附件上传的操作,我们一般需要通过设置Header方式,来传递用户的身份信息,如下data部分的代码
myHeaders: { Authorization: 'Bearer ' + getToken() }, // 用于上传文件的身份认证
而其中的界面组件中的data,是指定额外上传的文件附带信息,方便我们区分或者归类文件的。

附件列表,如果需要删除的,那么我们提示确认后,需要调用ABP后端API进行删除文件。
beforeRemoveAttach(file, fileList) { // 移除附件图片
// 服务端删除文件
var param = { guid: this.editForm.attachGUID, index: fileList.indexOf(file) }
fileupload.RemoveAttach(param).then(data => {
console.log(data.result)
})
},
另外,如果确认附件是全部图片,我们也可以用图片列表控件的方式展示图片信息,如下所示。

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理的更多相关文章
- 循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理
在很多列表展示数据的场合中,大多数都会需要一个排序的处理,以方便快速查找排序所需的数据,本篇随笔介绍如何结合ABP后端和Vue+Element前端结合的分页排序处理过程. 1.Vue+Element前 ...
- 循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)
在我们使用Vue+Element开发前端的时候,往往涉及到很多界面组件的使用,其中很多直接采用Element官方的案例即可,有些则是在这个基础上封装更好利用.更少代码的组件:另外有些则是直接采用第三方 ...
- 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储
在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...
- 循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理
在我们很多模块里面,都需要使用到一些诸如图片.Excel文件.PDF文件等附件的管理,一般我们倾向于把它独立为一个公用的附件管理模块,这样可以有效的统一管理附件的信息.本篇随笔介绍附件内容的管理,包括 ...
- 循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示
在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一.基于图表的处理,我们一般往往都是利用对应第三方的图表组件,然后在 ...
- 循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理
在我们一般开发的系统界面里面,列表页面是一个非常重要的综合展示界面,包括有条件查询.列表展示和分页处理,以及对每项列表内容可能进行的转义处理,本篇随笔介绍基于Vue +Element基础上实现表格列表 ...
- 循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用
在我们开发BS页面的时候,往往需要了解常规界面组件的使用,小到最普通的单文本输入框.多文本框.下拉列表,以及按钮.图片展示.弹出对话框.表单处理.条码二维码等等,本篇随笔基于普通表格业务的展示录入的场 ...
- 循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理
VUE+Element 前端是一个纯粹的前端处理,前面介绍了很多都是Vue+Element开发的基础,从本章随笔开始,就需要进入深水区了,需要结合ABP框架使用(如果不知道,请自行补习一下我的随笔:A ...
- 循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
在前面随笔<循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理>介绍了一个系统最初接触到的前端登录处理的实现,但往往对整个系统来说,一般会有很多业务对 ...
随机推荐
- Android作业 0923
计算器小应用 package com.example.myhomework2; import androidx.appcompat.app.AppCompatActivity; import andr ...
- Linux服务器内存监控—每小时检查&超出发送邮件&重启占用最高的Java程式
简介与优点 使用该脚本能自行判断系统内存使用情况是否超出设定百分比 能在超出预警值时执行重启程式的操作 能记录重启过程,并将具体LOG邮件发送给指定收信人 可以设定Crontab排程,达成每隔一段时间 ...
- PJzhang:CVE-2020-1472微软NetLogon权限提升漏洞~复现
猫宁~~~ 虚拟机上进行 安装windows 2008 R2 查看服务器ip 本地连接属性,取消ipv6,ip设置为192.168.43.158,子网掩码255.255.255.0,网关192.168 ...
- 《我想进大厂》之MQ夺命连环11问
继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起 ...
- Python-TypeError: object() takes no parameters
Error: TypeError: object() takes no parameters Where? 使用自定义类的时候,实例类的时候传递参数,提示这个错误 Why? 因为类实例的时候,并不需要 ...
- mysql-15-view
#视图 /* 含义:虚拟表,和普通表一样使用.通过表动态生成的数据 只保存了sql逻辑,不保存查询结果 应用场景: 1.多个地方用到同样的查询结果 2.该查询结果使用的sql语句较为复杂 */ USE ...
- 单例模式,reorder详解,线程安全,双检查锁
单例模式,分为饿汉式单例 和 懒汉式单例. 先把本类对象所需内存在main函数执行前就new出来,这是饿汉式单例. 个人思考: 为什么饿汉式不独霸天下,还有什么必要去研究使用cpp11上支持的双检查锁 ...
- linux应用-线程操作
文章写得好,转载一下, https://blog.csdn.net/triorwy/article/details/80380977
- 浅谈 Java集合
Java 集合 集合是对象的容器,定义了多个对象进行操作的常用方法,可实现数组的功能. Java集合类库所处位置:java.util.*. 与现代的数据结构类库的常见做法一样,Java集合类库也将接口 ...
- JMeter实战(一) 体系结构
此为开篇,介绍JMeter的组成结构,阅读后对JMeter形成整体认知和初步印象. 为了便于后续讲解,先明确下2个术语. 元件:如HTTP请求.事务控制器.响应断言,就是一个元件. 组件:如逻辑控制器 ...