space-storage.vue 5.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
<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">
VK1688's avatar
VK1688 已提交
11
			<button type="primary" plain @click="chooseImage">选择文件“后”上传</button>
12 13 14 15 16 17 18 19 20 21
			<text class="tips">先调用uni.chooseImage选完文件/图片/视频后用uniCloud.uploadFile方法上传</text>
			<button type="primary" plain @click="chooseAndUploadFile()">选择文件“并”上传</button>
			<text class="tips">调用uniCloud.chooseAndUploadFile方法选择文件/图片/视频直接上传</text>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
A
Anne_LXM 已提交
22 23
			return {
			}
24 25 26 27 28 29 30 31 32
		},
		mounted() {},
		methods: {
			chooseAndUploadFile(file) {
				uni.showLoading({
					title: '文件上传中...'
				})
				uniCloud.chooseAndUploadFile({
					type: 'image',
VK1688's avatar
VK1688 已提交
33
					onChooseFile: (res) => {
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
						console.log(res);
						const processAll = []
						for (let i = 0; i < res.tempFiles.length; i++) {
							processAll.push(this.cropImg(res.tempFiles[i]))
						}
						return Promise.all(processAll).then((fileList) => {
							let result = {
								tempFilePaths: []
							}
							result.tempFiles = fileList.map((fileItem, index) => {
								result.tempFilePaths.push(fileItem.path)
								return {
									path: fileItem.path,
									cloudPath: '' + Date.now() + index + '.' + fileItem.ext, // 云端路径,这里随便生成了一个
									fileType: fileItem.fileType
								}
							})
							return result
						})
					}
				}).then(res => {
					console.log(res)
					uni.showModal({
						content: JSON.stringify(res),
						showCancel: false
					});
				}).catch((err) => {
					console.log(err);
					uni.showModal({
						content: JSON.stringify(err),
						showCancel: false
					});
				}).finally(() => {
					uni.hideLoading()
				})
			},
			cropImg(file) {
				return new Promise((resolve, reject) => {
					let ext
					let filePathProcessed = file.path // 处理结果
					// #ifdef H5
					ext = file.name.split('.').pop()
					resolve({
						path: filePathProcessed,
						ext,
						fileType: file.fileType
					})
					// #endif
					// #ifndef H5
					uni.getImageInfo({
						src: file.path,
						success(info) {
							ext = info.type.toLowerCase()
							resolve({
								path: filePathProcessed,
								ext,
								fileType: file.fileType
							})
						},
						fail(err) {
							reject(new Error(err.errMsg || '未能获取图片类型'))
						}
					})
					// #endif
				})
			},
VK1688's avatar
VK1688 已提交
100
			chooseImage() {
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
				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((options) => {
VK1688's avatar
VK1688 已提交
136
					this.uploadFile(options);
137 138 139 140 141 142 143 144 145 146
				}).catch((err) => {
					uni.hideLoading()
					console.log(err);
					if (err.message !== 'Fail_Cancel') {
						uni.showModal({
							content: `图片上传失败,错误信息为:${err.message}`,
							showCancel: false
						})
					}
				})
VK1688's avatar
VK1688 已提交
147 148 149 150 151
			},
			uploadFile(options) {
				uni.showLoading({
					title: '文件上传中...'
				})
A
Anne_LXM 已提交
152 153 154 155 156 157 158 159 160
				let testRes = new Promise((resolve, reject) => {
					uniCloud.uploadFile({
						...options,
						onUploadProgress(e) {
							console.log(e)
						},
						success: (res) => {
							// 上传成功后的逻辑
							console.log(res);
VK1688's avatar
VK1688 已提交
161
							uni.showModal({
A
Anne_LXM 已提交
162
								content: '图片上传成功,fileID为:' + res.fileID,
VK1688's avatar
VK1688 已提交
163 164
								showCancel: false
							})
A
Anne_LXM 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
							resolve(res)
						},
						fail: (err) => {
							// 上传失败后的逻辑
							console.log(err);
							if (err.message !== 'Fail_Cancel') {
								uni.showModal({
									content: `图片上传失败,错误信息为:${err.message}`,
									showCancel: false
								})
							}
							reject(err)
						},
						complete: () => {
							uni.hideLoading()
VK1688's avatar
VK1688 已提交
180
						}
A
Anne_LXM 已提交
181
					})
VK1688's avatar
VK1688 已提交
182
				})
A
Anne_LXM 已提交
183
				return testRes
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
			}
		}
	}
</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%;
	}
VK1688's avatar
VK1688 已提交
218
</style>