uniapp在H5端实现PDF和视频的上传、预览、下载

news2024/11/15 5:43:45

上传

在这里插入图片描述

上传页面

		<u-form-item :label="(form.ququ3 == 1 ? '参培' : form.ququ3 == 2 ? '授课' : '') + '证明材料'" prop="ququ6" required>
          <u-button @click="upload" slot="right" type="primary" icon="arrow-upward" text="上传文件" size="small"></u-button>
        </u-form-item>
        <view class="red">只能上传视频和pdf文件(支持.pdf, .mp4, .avi, .ts)</view>
        <view v-for="(item, i) in form.ququ6" :key="i" class="mb-20 flex ">
          <view class="flex_l" @click="preview(item)">
            <image style="width: 46rpx;height: 46rpx;"
              :src="item.split('.')[item.split('.').length - 1] == 'pdf' ? '/static/pdf.png' : '/static/video.png'">
            </image>
            <view class="blue ml-20 u-line-1 flex-1 over-hidden">{{ item.split('-')[item.split('-').length - 1] }}</view>
          </view>
          <!-- <view class="blue" @click="preview(item)">预览</view> -->
        </view>


import { uploadFile } from '../../common/common'
upload() {
   uploadFile(6).then(res => {
      console.log(2222, res)
      this.form.ququ6 = this.form.ququ6.concat(res)
   })
},

上传方法

/**
 * 上传视频和pdf文件
 * @param {*} count 个数
 * @returns arr-- 最终结果   ['img','img']
 */
export let uploadFile = (count = 1) => {
	return new Promise((resolve, reject) => {
		uni.chooseFile({
			count: count,
			extension: ['.pdf', '.mp4', '.avi', '.ts'],
			success: function (res) {
				uni.showLoading({
					title: '上传中'
				})
				let imgarr = res.tempFilePaths
				let arr = []
				imgarr.forEach(item => {
					uni.uploadFile({
						url: '/prod-api' + '/file/upload',
						filePath: item,
						name: 'file',
						header: {
							Authorization: uni.getStorageSync('token') || ''
						},
						success: (res) => {
							console.log(JSON.parse(res.data))
							arr.push(JSON.parse(res.data).data.url)
							if (arr.length == imgarr.length) {
								uni.hideLoading()
								let arr1 = arr.filter(item => ['pdf', 'mp4', 'avi', 'ts'].includes(item.split('.')[item.split('.').length - 1]))
								if (arr1.length != arr.length) {
									uni.showToast({
										title: '只能上传视频和pdf文件',
										icon: 'none'
									})
								}
								resolve(arr1)
							}
						},
						fail: () => {
							uni.showToast({
								title: '上传失败',
								icon: 'none'
							})
						}
					});
				})
			}
		});
	})
}

整个页面静态

<template>
  <view class="ptb-20 plr-30 bg min100">
    <view class="bg-white radius-20 pd-30">
      <u--form labelPosition="left" :model="form" :rules="rules" ref="uForm" labelWidth="100">
        <u-form-item label="培训主题名" prop="ququ1" required>
          <u--input v-model="form.ququ1" disabledColor="#ffffff" placeholder="请输入主题名" border="none"></u--input>
        </u-form-item>
        <u-form-item label="培训分类" prop="ququ2" required @click="showPop(1)">
          <u--input class="disabled" v-model="form.ququ2" disabled disabledColor="#ffffff" placeholder="请选择培训分类"
            border="none"></u--input>
          <u-icon slot="right" name="arrow-right"></u-icon>
        </u-form-item>
        <u-form-item label="本人所属类别" prop="ququ3" required>
          <u-radio-group v-model="form.ququ3" placement="row">
            <u-radio class="mr-20" label="参培人" name='1'></u-radio>
            <u-radio label="授课人" name='2'></u-radio>
          </u-radio-group>
        </u-form-item>
        <u-form-item label="参与地点" prop="ququ4">
          <u--input v-model="form.ququ4" placeholder="请输入参与地点" border="none"></u--input>
        </u-form-item>
        <u-form-item label="起止日期" prop="ququ5" @click="showPop(2)" required>
          <u--input class="disabled" v-model="form.ququ5" disabled disabledColor="#ffffff" placeholder="请选择起止日期"
            border="none"></u--input>
          <u-icon slot="right" name="arrow-right"></u-icon>
        </u-form-item>
        <u-form-item :label="(form.ququ3 == 1 ? '参培' : form.ququ3 == 2 ? '授课' : '') + '证明材料'" prop="ququ6" required>
          <u-button @click="upload" slot="right" type="primary" icon="arrow-upward" text="上传文件" size="small"></u-button>
        </u-form-item>
        <view class="red">只能上传视频和pdf文件(支持.pdf, .mp4, .avi, .ts)</view>
        <view v-for="(item, i) in form.ququ6" :key="i" class="mb-20 flex ">
          <view class="flex_l" @click="preview(item)">
            <image style="width: 46rpx;height: 46rpx;"
              :src="item.split('.')[item.split('.').length - 1] == 'pdf' ? '/static/pdf.png' : '/static/video.png'">
            </image>
            <view class="blue ml-20 u-line-1 flex-1 over-hidden">{{ item.split('-')[item.split('-').length - 1] }}</view>
          </view>
          <!-- <view class="blue" @click="preview(item)">预览</view> -->
        </view>
        <u-form-item label="备注" prop="ququ7">
          <u--textarea v-model="form.ququ7" placeholder="请输入备注" maxlength="150" count autoHeight
            border="none"></u--textarea>
        </u-form-item>
      </u--form>
      <!-- 下拉选择框 -->
      <u-action-sheet :show="show" :actions="actions" title="请选择" @close="close" @select="confirmSelect">
      </u-action-sheet>
      <!-- 日历选择范围 -->
      <u-calendar :maxDate="maxDate" :minDate="minDate" monthNum="10" :show="showDate" mode="range" @confirm="confirmDate"
        @close="close"></u-calendar>
      <view class="flex mt-60">
        <u-button @click="reset">重置</u-button>
        <u-button type="primary" plain class="mlr-20" @click="save">保存草稿</u-button>
        <u-button type="primary" @click="submit">提交审核</u-button>
      </view>
    </view>
  </view>
</template>

<script>
import { uploadFile } from '../../common/common'
const d = new Date()
const year = d.getFullYear()
let month = d.getMonth() + 1
month = month < 10 ? `0${month}` : month
const date = d.getDate()
export default {
  data() {
    return {
      show: false,
      type: null,
      actions: [],

      showDate: false, // 日期选择
      maxDate: `${year}-${month + 1}-${date}`,
      minDate: `${year}-${month - 8}-${date}`,
      form: {
        ququ1: '',
        ququ2: '',
        ququ2Id: '',
        ququ3: '',
        ququ4: '',
        ququ5: '',
        ququ6: [],
        ququ7: '',
      },
      rules: {
        'ququ1': {
          required: true,
          message: '请输入主题名',
          trigger: ['blur']
        },
        'ququ2': {
          required: true,
          message: '请选择培训分类',
          trigger: ['blur', 'change']
        },
        'ququ3': {
          required: true,
          message: '请选择所属类别',
          trigger: ['blur', 'change']
        },
        'ququ5': {
          required: true,
          message: '请选择起止日期',
          trigger: ['blur', 'change']
        },
      },
    };
  },
  onLoad() {

  },
  methods: {
    showPop(type) {
      this.type = type
      if (type == 1) {
        this.show = true
        this.actions = [{
          name: '培训分类1',
          id: 1
        },
        {
          name: '培训分类2',
          id: 2
        },
        ]
      } else {
        this.showDate = true
      }
    },
    close() {
      this.show = false
      this.showDate = false
      this.type = null
    },
    confirmSelect(e) {
      this.form['ququ2'] = e.name
      this.form['ququ2Id'] = e.id
      this.$refs.uForm.validateField('ququ2')
    },
    confirmDate(e) {
      console.log(e);
      this.form['ququ5'] = e[0] + '~' + e[e.length - 1]
      this.showDate = false
    },
    upload() {
      uploadFile(6).then(res => {
        console.log(2222, res)
        this.form.ququ6 = this.form.ququ6.concat(res)
      })
    },
    preview(item) {
      if (item.split('.')[item.split('.').length - 1] == 'pdf') {
        uni.navigateTo({
          url: '/pages/course/pdf?url=' + item
        })
      } else {
        // uni.navigateTo({
        //   url: '/pages/course/video?url=' + item
        // })
        window.open(item)
      }
    },
    submit() {
      this.$refs.uForm.validate().then(res => {
        if (!this.form.ququ6.length) {
          uni.$u.toast('请上传证明材料')
          return
        }
        uni.$u.toast('校验通过')
        this.$http('/system/user/profile', {
          avatar: this.form
        }, "post").then(res => {
          uni.showToast({
            title: '提交成功',
          })
        })
      }).catch(errors => {
        uni.$u.toast('校验失败')
      })
    },
    save() {
      this.$http('/system/user/profile', {
        avatar: this.form
      }, "post").then(res => {
        uni.showToast({
          title: '保存成功',
        })
      })
    },
    reset() {
      this.$refs.uForm.resetFields()
    },
  },

};
</script>

<style scoped lang="scss"></style>

预览和下载

在这里插入图片描述

预览页面 PDF预览详见

 <view class="title-left bold mtb-20">附件记录</view>
    <view v-for="(item, i) in form.ququ6" :key="i" class="mb-20 ml-30 flex">
      <view class="flex_l" @click="preview(item)">
        <image style="width: 46rpx;height: 46rpx;"
          :src="item.split('.')[item.split('.').length - 1] == 'pdf' ? '/static/pdf.png' : '/static/video.png'">
        </image>
        <view class="blue ml-20 u-line-1 flex-1 over-hidden">{{ item.split('-')[item.split('-').length - 1] }}</view>
      </view>
      <view class="green" @click="downLoad(item)">下载</view>
    </view>


 data() {
    return {
      form: {
        ququ6: ["https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4", "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"]
      }
    }
  },

 preview(item) {
      if (item.split('.')[item.split('.').length - 1] == 'pdf') {
        uni.navigateTo({
          url: '/pages/course/pdf?url=' + item
        })
      } else {
        // uni.navigateTo({
        //   url: '/pages/course/video?url=' + item
        // })
        window.open(item)
      }
    },
    downLoad(url) {
      if (url.split('.')[url.split('.').length - 1] == 'pdf') {
        window.open(url)
      } else {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob'; // 返回类型blob
        xhr.onload = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            let blob = this.response;
            // 转换一个blob链接
            let u = window.URL.createObjectURL(new Blob([blob]));
            let a = document.createElement('a');
            a.download = url.split('-')[url.split('-').length - 1]; //下载后保存的名称
            a.href = u;
            a.style.display = 'none';
            document.body.appendChild(a);
            a.click();
            a.remove();
            uni.hideLoading();
          }
        };
        xhr.send()
      }
    },

详情页面静态

<template>
  <view class="mlr-30 pt-20">
    <view class="title-left bold mb-20">培训详情</view>
    <u-cell-group :border="false">
      <u-cell :border="false" title="培训主题名" :value="userInfo.nickName"></u-cell>
      <u-cell :border="false" title="培训分类" :value="userInfo.sex"></u-cell>
      <u-cell :border="false" title="本人所属类别" :value="userInfo.sex == 1 ? '参培人' : '授课人'"></u-cell>
      <u-cell :border="false" title="起止日期" :value="userInfo.phonenumber"></u-cell>
      <u-cell :border="false" title="参与地点" :value="userInfo.nickName"></u-cell>
      <u-cell :border="false" title="提交时间" :value="userInfo.nickName"></u-cell>
    </u-cell-group>
    <view class="title-left bold mtb-20">附件记录</view>
    <view v-for="(item, i) in form.ququ6" :key="i" class="mb-20 ml-30 flex">
      <view class="flex_l" @click="preview(item)">
        <image style="width: 46rpx;height: 46rpx;"
          :src="item.split('.')[item.split('.').length - 1] == 'pdf' ? '/static/pdf.png' : '/static/video.png'">
        </image>
        <view class="blue ml-20 u-line-1 flex-1 over-hidden">{{ item.split('-')[item.split('-').length - 1] }}</view>
      </view>
      <view class="green" @click="downLoad(item)">下载</view>
    </view>
    <view class="title-left bold mb-20">审批详情</view>
    <u-cell-group :border="false">
      <u-cell :border="false" title="审批状态" :value="userInfo.nickName"></u-cell>
      <u-cell :border="false" title="当前审批人" :value="userInfo.sex"></u-cell>
    </u-cell-group>
    <view class="flex mt-60">
      <u-button @click="back">返回首页</u-button>
      <u-button type="primary" plain class="mlr-20" @click="edit">修改</u-button>
      <u-button type="primary" @click="revoke">撤回流程</u-button>
    </view>
  </view>
</template>

<script>
import {
  mapState
} from 'vuex'
export default {
  data() {
    return {
      form: {
        ququ6: ["https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4", "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"]
      }
    }
  },
  computed: {
    ...mapState(['userInfo']),
  },
  onLoad() {
    // 刷新个人信息
    this.$store.dispatch('updateUserInfo')
    this.img = this.userInfo.avatar ? this.userInfo.avatar : '/static/user-default.png'
  },
  methods: {
    preview(item) {
      if (item.split('.')[item.split('.').length - 1] == 'pdf') {
        uni.navigateTo({
          url: '/pages/course/pdf?url=' + item
        })
      } else {
        // uni.navigateTo({
        //   url: '/pages/course/video?url=' + item
        // })
        window.open(item)
      }
    },
    downLoad(url) {
      if (url.split('.')[url.split('.').length - 1] == 'pdf') {
        window.open(url)
      } else {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob'; // 返回类型blob
        xhr.onload = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            let blob = this.response;
            // 转换一个blob链接
            let u = window.URL.createObjectURL(new Blob([blob]));
            let a = document.createElement('a');
            a.download = url.split('-')[url.split('-').length - 1]; //下载后保存的名称
            a.href = u;
            a.style.display = 'none';
            document.body.appendChild(a);
            a.click();
            a.remove();
            uni.hideLoading();
          }
        };
        xhr.send()
      }
    },
    revoke() {
      this.$http('/system/user/profile', {
        avatar: 1
      }, "put").then(res => {
        uni.showToast({
          title: '撤回成功',
        })
      })
    },
    edit() {
      uni.navigateTo({
        url: './add?id=1'
      })
    },
    back() {
      uni.navigateBack()
    }
  }
}
</script>

<style lang="scss" scoped>
::v-deep .u-cell__body {
  padding: 5px 15px !important;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1261412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏

deepin-terminal 安装 源里面自带了这个软件&#xff0c;可以直接装 sudo apt install deepin-terminal 启动 按下Win键&#xff0c;输入deep即可快速检索出图标&#xff0c;点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0…

Flask Echarts 实现历史图形查询

Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递。用户界面使用ECharts图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图&#xff0c;能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型&#xff0c;包括折线图、柱状图、饼图、散点…

深度剖析API接口测试工具的企业价值

随着企业软件开发的日益复杂和互联网应用的普及&#xff0c;API接口成为不同软件系统之间信息传递的桥梁。在这一背景下&#xff0c;API接口测试工具的应用变得愈加重要&#xff0c;对企业的发展和软件质量起到了关键性的作用。本文将深入探讨API接口测试工具在企业中的重要性&…

进程(4)——进程地址空间【linux】

进程&#xff08;4&#xff09;——进程地址空间【linux】 一.什么是进程地址空间二.进程地址空间不是真实地址&#xff1f;三.物理地址与进程地址空间的关系&#xff08;整体部分&#xff09;四. 细节4.1 进程地址空间的本质&#xff1a;4.2 为什么要有进程地址空间&#xff1…

机器学习——多元线性回归升维

机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义&#xff1a;将原始的数据表示从低维空间映射到高维空间。在线性回归中&#xff0c;升维通常是通过引入额外的特征来实现的&#xff0c;目的是为了更好地捕捉数据的复杂性&#…

MacOS 系统 Flutter开发Android 环境配置

上节我们已经把 开发工具准备齐全&#xff0c;并可以进行Flutter的web开发&#xff0c;本节将做安卓开发环境进行详细说明 接上节这里先说下&#xff0c;系统环境 MacOS14 &#xff08;Sonoma&#xff09; 芯片 Apple M3 执行命令&#xff1a;flutter doctor 提示如下&#…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)一

第三部分&#xff1a;Shell高级&#xff08;一&#xff09; 这一章讲解 Shell 脚本编程的进阶内容&#xff0c;主要涉及重定向、文件描述符、管道和过滤器、子 Shell、信号等。 本章会使用到一些底层的编程知识&#xff0c;有C语言和 C 编程经验的程序员阅读起来将会更加轻松。…

《微信小程序开发从入门到实战》学习三十三

第四章 云开发 本章云开发技术的功能与使用&#xff0c;包括以下几点&#xff1a; 1.学习使用云开发控制台 2.学习云开发JSON数据库功能 3.学习云开文件存储功能 4.学习云函数功能 5.使用云开发技术实现投票小程序的服务端功能 投票小程序大部分已经实现。需要实现&#…

人工智能-优化算法之凸集

凸性 凸性&#xff08;convexity&#xff09;在优化算法的设计中起到至关重要的作用&#xff0c; 这主要是由于在这种情况下对算法进行分析和测试要容易。 换言之&#xff0c;如果算法在凸性条件设定下的效果很差&#xff0c; 那通常我们很难在其他条件下看到好的结果。 此外&…

二叉堆与优先队列

二叉堆与优先队列 1、什么是二叉堆 1.1、初识二叉堆 什么是二叉堆&#xff1f; 二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型。 最大堆&#xff08;也叫大顶堆&#xff09;&#xff1a;任意节点的值都大于或等于它的左右孩子节点的值&#xff0c;并且最大的值位…

SHAP(一):具有 Shapley 值的可解释 AI 简介

SHAP&#xff08;一&#xff09;&#xff1a;具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法&#xff0c;具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 Shapley 的机器学习模型解释。 我…

NX二次开发UF_CURVE_create_arc_point_tangent_radius 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_tangent_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_tangent_radius(tag_t point, tag_t tangent_object, double radius, UF_CURVE_…

初识前后端数据交互(新手篇)

一个软件项目的开发必然是离不开前端和后端的协作&#xff0c;对于刚入行的新手前端或者新手后端来说&#xff0c;很有必要了解一下对方是在做什么&#xff0c;以及提供给自己什么样的帮助&#xff0c;为什么需要对方共同协作才能完成整个软件项目的开发呢&#xff1f;希望这篇…

Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…

从0开始学习JavaScript--JavaScript对象继承深度解析

JavaScript中的对象继承是构建灵活、可维护代码的关键部分。本文将深入讨论JavaScript中不同的继承方式&#xff0c;包括原型链继承、构造函数继承、组合继承等&#xff0c;并通过丰富的示例代码展示它们的应用和差异。通过详细解释&#xff0c;大家可以更全面地了解如何在Java…

Shopee如何入驻?如何防封?

Shopee作为东南亚领航电商平台&#xff0c;面向东南亚蓝海市场&#xff0c;近年来随着东南亚市场蒸蒸日上&#xff0c;虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

15、矩阵键盘密码锁

矩阵键盘密码锁 main.c #include <REGX52.H> #include "Delay.h" #include "LCD1602.h" #include "MatrixKey.h"//初始化变量 unsigned char KeyNum; unsigned int Password,Count;void main() {//LCD屏幕初始化显示Password:LCD_Init();…