ext-storage-qiniu.vue 4.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
<template>
	<view class="content">
		<view class="title">直接上传文件到扩展存储-七牛云</view>
		<view class="tips">
			<text>
				各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。
			</text>
			<j-link text="参考" url="https://uniapp.dcloud.io/uniCloud/quickstart?id=%e5%b0%8f%e7%a8%8b%e5%ba%8f%e4%b8%ad%e4%bd%bf%e7%94%a8unicloud%e7%9a%84%e7%99%bd%e5%90%8d%e5%8d%95%e9%85%8d%e7%bd%ae"></j-link>
		</view>
		<view class="btn-list">
			<button type="primary" plain @click="upload(false)">选择文件“后”上传</button>
			<text class="tips">先调用uni.chooseImage选完文件/图片/视频后用uni.uploadFile方法上传</text>
			<button type="primary" plain @click="upload(true)">上传并设为私有文件</button>
			<text class="tips">上传完成后设置为私有文件</text>
			<button type="primary" plain @click="getTempFileURL()" v-if="privateFileID">获取私有文件临时下载链接</button>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				privateFileID: ""
			}
		},
		mounted() {},
		methods: {
			upload(isPrivate) {
				new Promise((resolve, reject) => {
					uni.chooseImage({
						count: 1,
						success: res => {
							const path = res.tempFilePaths[0]
							let ext
							// #ifdef H5
							ext = res.tempFiles[0].name.split('.').pop()
							const options = {
								filePath: path,
								cloudPath: Date.now() + '.' + ext
							}
							resolve(options)
							// #endif
							// #ifndef H5
							uni.getImageInfo({
								src: path,
								success(info) {
									const options = {
										filePath: path,
										cloudPath: Date.now() + '.' + info.type.toLowerCase()
									}
									resolve(options)
								},
								fail(err) {
									reject(new Error(err.errMsg || '未能获取图片类型'))
								}
							})
							// #endif
						},
						fail: () => {
							reject(new Error('Fail_Cancel'))
						}
					})
				}).then(async (options) => {
					uni.showLoading({
						title: '文件上传中...'
					})
					const uniCloudStorageExtCo = uniCloud.importObject("ext-storage-co", {
						customUI: true
					});
					const uploadFileOptionsRes = await uniCloudStorageExtCo.getUploadFileOptions({
						cloudPath: `test/${Date.now()}.jpg`, // 支持自定义目录
					});
					console.log('uploadFileOptionsRes: ', uploadFileOptionsRes)
					return new Promise((resolve, reject) => {
						const uploadTask = uni.uploadFile({
							...uploadFileOptionsRes.uploadFileOptions, // 上传文件所需参数
							filePath: options.filePath, // 本地文件路径
							success: () => {
								const res = {
									cloudPath: uploadFileOptionsRes.cloudPath, // 文件云端路径
									fileID: uploadFileOptionsRes.fileID, // 文件ID
									fileURL:  uploadFileOptionsRes.fileURL, // 文件URL(如果是私有权限,则此URL是无法直接访问的)
								};
								resolve(res);
							},
							fail: (err) => {
								reject(err);
							}
						});
						// 监听上传进度
						uploadTask.onProgressUpdate((res) => {
							console.log("监听上传进度", res);
						});
					});
				}).then(async res => {
					console.log(res);
					if (isPrivate) {
						// 设为私有文件
						const uniCloudStorageExtCo = uniCloud.importObject("ext-storage-co", {
							customUI: true
						});
						await uniCloudStorageExtCo.setFilePrivate({
							fileID: res.fileID
						});
						this.privateFileID = res.fileID;
					}
					uni.showModal({
						content: '图片上传成功,fileID为:' + res.fileID,
						showCancel: false
					})
					uni.hideLoading()
				}).catch((err) => {
					uni.hideLoading()
					console.log(err);
					if (err.message !== 'Fail_Cancel') {
						uni.showModal({
							content: `图片上传失败,错误信息为:${err.message}`,
							showCancel: false
						})
					}
				})
			},
			async getTempFileURL(){
				const uniCloudStorageExtCo = uniCloud.importObject("ext-storage-co");
				let res = await uniCloudStorageExtCo.getTempFileURL({
					fileList: [ this.privateFileID ]
				});
				let tempFileURL = res[0].tempFileURL;
				uni.showModal({
					content: '图片临时下载链接为:' + tempFileURL,
					showCancel: false
				})
			}
		}
	}
</script>

<style>
	.content {
		padding-bottom: 30px;
	}

	.title {
		font-weight: bold;
		text-align: center;
		padding: 20px 0px;
		font-size: 20px;
	}

	.tips {
		color: #999999;
		font-size: 14px;
		padding: 20px 30px;
	}

	.btn-list {
		padding: 0px 30px;
	}

	.btn-list button {
		margin-top: 20px;
	}

	.upload-preview {
		width: 100%;
	}
</style>