uniapp在线预览pdf

准备

先下载pdf.js然后和node_modules同级新建一个hybrid文件目录,把下载好的pdf.js解压进去,(微信收藏里有)

 开始

然后在pages下新建一个FilePreview页面,用来呈现预览的pdf

在FilePreview.vue页面中:

<template>
	<view>
		<web-view :src="allUrl"></web-view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				viewerUrl: '/hybrid/html/readPdf/index/index.html',
				allUrl: ''
			};
		},
		// 加载页面时接收的参数
		onLoad(options) {
			this.allUrl = this.viewerUrl + '?url=' + options.url
			console.log(options, '00000');
		}
	}
</script>

<style lang="scss">

</style>

在请求后端文件流的组件,或者页面中,得转成Blob文件类型,我这里的查看文件,是在UpLoader组件里面写的

 

<!-- 上传 -->
<template>
	<view class="up-loader">
		<van-uploader v-model="fileList" :preview-full-image="false" @click-preview="clickItem" :before-delete="deletFile"
			:after-read="upFile" accept="file">
			<van-button icon="plus"></van-button>
		</van-uploader>
	</view>
</template>
<script>
	import storage from '@/common/storage.js'
	export default {
		name: "up-loader",
		data() {
			return {
				fileList: [],
				idsArr: [] // 点击预览需要传给后端id的数组
			}
		},
		methods: {
			afterRead(file) {
				console.log(file, 999);
			},
            // 删除事件
			deletFile(val, index) {
				this.fileList.splice(index.index, 1)
			},
			// 文件上传
			upFile(val) {
				val.status = 'uploading'
				val.message = '上传中...'
				uni.uploadFile({
					url: 'http://xxx.xxx.xx:9000/portal/system/file/v1/upload?tenantId=-1',
					name: 'file',
					header: {
						Authorization: storage.getItemSync('token') ?  storage.getItemSync('token') : ''                
					},
					formData: {
						file: val.file
					},
					success: (res) => {
						if (res.statusCode === 200) {
							val.status = 'success'
							val.message = '上传成功'
							this.idsArr.push(res.data)
							this.$emit('change', res.data)
						}
					}
				})
			},
			// 点击预览
			clickItem(val, index) {
				let params = JSON.parse(this.idsArr[index.index]).fileId;
				this.$api.preview(params).then(res => {
					let pdfData = res
					let blob = new Blob([pdfData], {
						type: 'application/pdf;charset=UTF-8'
					})
                    // 得转成blob文件
					pdfData = window.URL.createObjectURL(blob)
					let url = encodeURIComponent(pdfData)
                    // 最后已encodeURIComponent的格式输出
					uni.navigateTo({
						url: '/pages/FilePreview/FilePreview?url=' + url
					})
				})
			}
		}
	}
</script>

<style lang="scss" scoped>
	.van-button {
		padding: 79rpx 54rpx;
		border: 2rpx solid #ddd;
		font-size: 38rpx;
	}
</style>

注意:

在接口请求的时候在请求前加{responseType: arraybuffer}要不然请求出来会看不到东西

request.js封装:

import storage from './storage'
import config from '@/common/config.js'
import {
	Notify
} from 'vant'
const BASE_URL = config.api()
export const request = (url, method, params, responseType) => {
	return new Promise((resolve, reject) => {
		uni.request({
			url: BASE_URL + url, // 地址
			method: method || 'post', // 请求方式
			responseType: responseType ? responseType : '',
			header: {
				Authorization: storage.getItemSync('token') ? storage.getItemSync('token') : ''
			}, // token
			data: params || {}, // 参数
			success: (res) => {
				if (res.statusCode === 401) {
					uni.navigateTo({
						url: '/pages/login/login'
					})
					return
				} else if (res.statusCode === 500) {
					Notify('操作错误', '1500', 'error')
					return
				}
				// 成功将data抛出
				resolve(res.data)
			},
			// ... 这里还可以做一些请求完成之后的提示
			fail: (err) => {
				Notify('系统错误', '1500', 'error')
				return reject(err)
			}
		})
	})
}

在定义接口的时候

import {
	request
} from '@/common/request.js'

export default {
	// 预览
	preview: (id) => request(`/portal/system/file/v1/preview?fileId=${id}`, 'get', '', 'arraybuffer')
}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值