图片、文件上传一般分两种方式,第一种方式前端直接上传到云平台(七牛云、又拍云、阿里云、腾讯云等等),第二种方式由前端上传到后端服务器,后端服务器视具体需求决定是否上传到云平台。

七牛云直传

  1. 查看七牛云文档,获取上传地址并填入,比如:http://up-z2.qiniup.com

image.png

  1. 后端生成上传token(注意:token不能直接保存在前端代码中,前端必须通过编码请求后端动态获取);
  2. 在组件的onBeforeUpload交互事件中编写代码,如下所示:

image.png

截图中的代码复制如下:

  1. var currentWidget = this;
  2. //server/api-path/getUploadToken:指向后端API的请求URL
  3. axios.get('server/api-path/getUploadToken').then(function(response) {
  4. var token = response.uploadToken;
  5. currentWidget.setUploadData('token', token);
  6. }).catch(function(error) {
  7. //处理错误
  8. })

又拍云直传

  1. 查看又拍云文档,获取上传地址并填入,比如:http://v0.api.upyun.com/<你的存储空间名称>

image.png

  1. 后端生成上传需要的policy和authorization(注意:policy、authorization不能直接保存在前端代码中,前端必须通过编码请求后端动态获取);
  2. 在组件的onBeforeUpload交互事件中编写代码,如下所示:

image.png

截图中的代码复制如下

  1. var currentWidget = this;
  2. //server/api-path/getUploadAuth:指向后端API的请求URL
  3. axios.get('server/api-path/getUploadAuth').then(function(response) {
  4. var policy = response.policy;
  5. var authorization = response.authorization
  6. currentWidget.setUploadData('policy', policy);
  7. currentWidget.setUploadData('authorization', authorization);
  8. }).catch(function(error) {
  9. //处理错误
  10. })

其他云平台(腾讯云、阿里云等)前端直传的实现方法类似,如有问题可在微信技术交流群咨询。

上传后端服务器

  1. 获取到后端服务器的上传地址,填入:

image.png

  1. 后端接口在处理文件上传时,如果需要获取上传请求的cookie信息,则需要选中“发送cookie凭证”:

image.png

图片、文件上传成功后的表单数据处理

通常情况下,图片、文件上传到云平台或后端服务器后会被重新命名,前端的表单数据需要收集新的文件名以及图片预览URL或文件下载URL,这时候须通过组件的交互事件onUploadSuccess编写处理代码。
可参考picture-upload-widget.vue组件源码中的handlePictureUpload方法==>:
picture-upload-widget.vue组件源码

或file-upload-widget.vue组件源码中的handleFileUpload方法==>:
file-upload-widget.vue组件源码

编辑、查看状态的数据回显处理

跟所有字段类型组件一样,在表单编辑及查看状态下,图片、文件上传组件的回显数据也来自于表单数据对象formData,该数据对象通常由form-data属性传入,或者通过setFormData()方法赋值。

不太一样的是,图片、文件上传组件的回显数据要求如下格式,即包含name、url两个属性的对象数组:

  1. [
  2. {
  3. name: '员工手册.docx',
  4. url: 'https://files.mydomain.com/upload/202201/员工手册.docx'
  5. },
  6. {
  7. name: '在路上.jpg',
  8. url: 'https://photos.mydomain.com/upload/202202/在路上.jpg'
  9. }
  10. ]