RN 文件下载&图片下载

91 阅读1分钟
import RNFS from 'react-native-fs'
import { CameraRoll } from '@react-native-camera-roll/camera-roll'
import { PermissionsAndroid, Platform } from 'react-native'
import { getImageUrl } from '@/utils'
import PrivilegeUtil from './PrivilegeUtil'

/**
 * 保存远程图片到相册
 * @param {string} imageUrl - 远程图片的 URL
 * @returns {Promise<void>}
 */
const saveImageToAlbum = async (url: string) => {
	try {
		let canUse = await PrivilegeUtil.requestStorePermission()
		if (!canUse) {
			return false
		}
		// 下载图片到本地临时目录
		const imageUrl = getImageUrl(encodeURI(url) || '') ?? '' // 图片路径

		const destinationPath = `${RNFS.DocumentDirectoryPath}/${new Date().getTime()}.png` // 保存到本地文档目录

		const downloadResult = await RNFS.downloadFile({
			fromUrl: imageUrl,
			toFile: destinationPath,
		})

		const res = await downloadResult.promise
		if (res.statusCode === 200) {
			// 保存图片到相册
			if (Platform.OS === 'ios') {
				CameraRoll.saveAsset(destinationPath, { type: 'photo' })
					.then((res) => {
						Toast.success('图片下载成功,已保存到手机相册')
						return true
					})
					.catch((err) => {
						Toast.error('图片报错失败,请重试')
						return false
					})
			} else {
				return CameraRoll.saveAsset(`file://${destinationPath}`)
					.then((res) => {
						Toast.success('图片下载成功,已保存到手机相册')
						return true
					})
					.catch((err) => {
						Toast.error('图片报错失败,请重试')
						return false
					})
			}

			return true
		} else {
			Toast.error('图片下载失败,请重试')
			return false
		}
	} catch (error) {
		Toast.error('保存图片失败,请检查网络连接或权限设置。')
		console.log('保存图片失败', error)
		return false
	}
}

/***
 * 保存本地图片
 *
 */
export const saveImageToAlbumByLocal = async (url: string) => {
	try {
		let canUse = await PrivilegeUtil.requestStorePermission()
		if (!canUse) {
			return false
		}
		await CameraRoll.saveAsset(url, { type: 'photo' })
		console.log('保存成功')
	} catch (error) {
		console.log('图片保存失败', error)
		handleEventTracking({
			tip: '图片保存失败--saveImageToAlbum.ts--47',
			data: { error },
		})
	}
}

export default saveImageToAlbum