1. 程式人生 > 其它 >微信小程式下載儲存文件的間接解決辦法

微信小程式下載儲存文件的間接解決辦法

技術標籤:javascript小程式

最近專案碰到一種需求——小程式提供下載儲存pdf途徑。平時小程式專案用到下載檔案的api(wx.downloadFile)僅僅是用來下載圖片,並使用小程式儲存圖片到本地的api完成儲存操作。好在小程式提供了儲存檔案到本地的pai(wx.saveFile),一番操作之後,我查看了手機上的檔案,納尼!下載的檔案儲存在哪?

通過不斷的查詢資料(微信社群),我終於找到了檔案儲存的路徑:

真實路徑:手機\內部儲存\tencent\MicroMsg\wxanewfiles\xxxx\abc.txt
xxxx:是一個很長的由英文數字組成的資料夾,這個資料夾的命名規則,尚不清楚

好傢伙!我都找不到檔案的儲存路徑,還指望使用者找到?更何況ios不能查詢檔案,所以只能使用其他方法解決問題:微信提供了開啟文件的api(wx.openopenDocument),通過設定showMenu屬性為true實現可以分享操作,可以讓使用者快速找到檔案。具體實現如下:

定義下載好的檔案儲存到的系統路徑:

wx.env.USER_DATA_PATH是專門獲取檔案系統中的使用者目錄路徑的常量值。

const CACHE_PATH = wx.env.USER_DATA_PATH + '/資料夾'

因為不知道本地是否存在該資料夾,所以需要判斷本地是否存在該目錄:

		accessSync(
) { return new Promise((resolve, reject) => { const file = wx.getFileSystemManager() try { file.accessSync(CACHE_PATH) resolve() } catch (error) { resolve(error) } }); },

如果本地不存在該資料夾,建立:

		mkdirSync() {
			return new Promise((resolve, reject) => {
				const file
= wx.getFileSystemManager() try { file.mkdirSync(CACHE_PATH, true) resolve() } catch (error) { resolve(error) } }); },

解決了儲存的途徑,可以開始下載儲存:

wx.showLoading({
				title: '正在下載檔案',
			})
			wx.downloadFile({
				url: 'https://xxxx/aa880655000886d62cf424424db25229.pdf', //僅為示例,並非真實的資源
				success(res) {
					// 獲取所下載的檔案型別
					const file_type = res.header['Content-Type'].split('/')[1]
					const file_path = res.tempFilePath

					// ios和安卓系統儲存和開啟文件有不同,根據不同系統做不同處理
					if (app.globalData.systemInfo.platform === 'ios') {
						// ios系統沒有提供檔案搜尋,所以直接開啟文件分享(間接下載)
						wx.openDocument({
							filePath: file_path,
							fileType: file_type,
							showMenu: true,
							success: function (res) {
								console.log('開啟文件成功')
							}
						})
						return
					}

					wx.saveFile({
						tempFilePath: file_path,
						filePath: CACHE_PATH + `/${new Date().getTime()}.${file_type}`,
						success(res) {
							wx.hideLoading()
							wx.showToast({
								title: '儲存成功',
								icon: 'none'
							})

							// 開啟pdf下載,可轉發
							wx.openDocument({
								filePath: res.savedFilePath,
								fileType: file_type,
								showMenu: true,
								success: function (res) {
									console.log('開啟文件成功')
								}
							})
						},
						fail(error) {
							console.log('儲存失敗', error)
							wx.hideLoading()
							wx.showToast({
								title: '儲存失敗',
								icon: 'none'
							})
						}
					})
				},
				fail(error) {
					console.log('下載失敗', error)
					wx.hideLoading()
					wx.showToast({
						title: '下載失敗',
						icon: 'none'
					})

				}
			})

本來開啟文件的時候,我是沒有區分ios和安卓的,但是測試發現ios打不開下載儲存到本地的文件,多次測試才發現,下載完之後開啟檔案,在ios是行得通的。

在多次測試過程中,我還發現安卓端下載完之後不經過儲存,直接開啟文件分享給好友,分享出來的檔案是這樣的:
在這裡插入圖片描述
好傢伙,看來小程式這條路還有得走!