wx.getFileSystemManager().getFileInfo和wx.getFileInfo什么区别
时间: 2024-01-16 22:04:35 浏览: 252
`wx.getFileSystemManager().getFileInfo` 和 `wx.getFileInfo` 都是用于获取文件信息的 API,但是它们的使用方式和作用范围不同。
`wx.getFileSystemManager().getFileInfo` 是通过 `wx.getFileSystemManager()` 获取的文件系统管理器来调用的,它可以获取本地文件的详细信息,包括文件大小、创建时间、修改时间等等。这个 API 可以访问小程序的所有文件,包括用户文件和小程序文件。
而 `wx.getFileInfo` 只能获取小程序文件的信息,例如本地资源文件(如图片、音频等)的大小、创建时间、修改时间等。它不能获取用户文件的信息。
因此,如果你需要获取本地文件的信息,应该使用 `wx.getFileSystemManager().getFileInfo`;如果你只需要获取小程序文件的信息,使用 `wx.getFileInfo` 更加方便。
相关问题
v.pics.forEach((u, i) => { if (u.split('/')[0] == 'cloud:') { } else { picCursor.push(i); wx.getFileSystemManager().getFileInfo({ filePath: u, success: function (res) { if (res.size > 200 * 1024) { wx.compressImage({ src: u, quality: 30, }).then(res => { const tmpFilePath = res.tempFilePath; tmpPromise.push(wx.cloud.uploadFile({ cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'), filePath: tmpFilePath, })); }) } else { tmpPromise.push(wx.cloud.uploadFile({ cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'), filePath: u, })) } } }) } });请分析指出这段代码存在哪些问题?
这段代码存在以下问题:
1. 在压缩图片后,没有进行错误处理,如果压缩失败,可能会导致上传失败,因此需要加上 catch 方法来处理异常情况。
2. 在压缩图片后,没有进行清理,可能会导致临时文件占用过多空间,因此需要在上传完成后,手动删除临时文件。
3. 在循环中,每次调用 wx.getFileSystemManager().getFileInfo() 方法都会进行一次文件系统的操作,这会降低程序的性能。因此,可以在循环外部先将需要获取文件信息的文件路径保存下来,然后再进行循环,这样就可以避免重复操作文件系统,提高程序的性能。
4. 在上传文件时,没有进行错误处理,如果上传失败,可能会导致程序出错。因此,需要加上 catch 方法来处理上传文件失败的情况。
综上所述,应该修改为以下代码:
```
// 保存需要获取文件信息的文件路径
const filePaths = v.pics.filter(u => u.split('/')[0] != 'cloud:');
// 获取文件信息
wx.getFileSystemManager().getFileInfo({
filePath: filePaths,
success: function (res) {
// 将文件路径和文件信息保存到一个数组中
const files = res.fileList.map((file, index) => {
return {
path: filePaths[index],
size: file.size,
};
});
// 过滤出需要压缩的文件
const filesToCompress = files.filter(file => file.size > 200 * 1024);
// 压缩图片并上传到云存储
filesToCompress.forEach((file, index) => {
wx.compressImage({
src: file.path,
quality: 30,
}).then(res => {
// 保存压缩后的临时文件地址
const tmpFilePath = res.tempFilePath;
tmpPromise.push(wx.cloud.uploadFile({
cloudPath: 'usersproducts/' + upID + Date.now() + (index + '.png'),
filePath: tmpFilePath,
}).then(() => {
// 上传成功后,删除临时文件
wx.getFileSystemManager().unlink({
filePath: tmpFilePath,
success: function () {},
fail: function () {},
});
}).catch((err) => {
console.error('上传文件失败', err);
}));
}).catch((err) => {
console.error('压缩图片失败', err);
});
});
// 直接上传不需要压缩的文件
const filesNotToCompress = files.filter(file => file.size <= 200 * 1024);
filesNotToCompress.forEach((file, index) => {
tmpPromise.push(wx.cloud.uploadFile({
cloudPath: 'usersproducts/' + upID + Date.now() + (index + '.png'),
filePath: file.path,
}).catch((err) => {
console.error('上传文件失败', err);
}));
});
},
fail: function (err) {
console.error('获取文件信息失败', err);
},
});
```
这样修改后,代码就更加健壮,可读性也更高了。
v.pics.forEach((u, i) => { if (u.split('/')[0] == 'cloud:') { } else { wx.getFileSystemManager().getFileInfo({ filePath: u, success: function (res) { if (res.size > 200 * 1024) { picCursor.push(i) tmpPromise.push(wx.compressImage({ src: u, quality: 30, }).then(res => { return wx.cloud.uploadFile({ cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'), filePath: res.tempFilePath, }) })) } else { picCursor.push(i) tmpPromise.push(wx.cloud.uploadFile({ cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'), filePath: u, })) } } }) } })这段代码存在问题,图片压缩后,应该上传图片的,实际运行时却没有上传图片
这段代码中存在异步操作,导致上传图片的操作没有等到压缩完成就执行了,可以使用 Promise.all() 方法来解决这个问题。具体操作可以将所有的压缩操作和上传操作存储在一个 Promise 数组中,然后使用 Promise.all() 方法等待所有 Promise 完成后再执行上传操作。可以参考以下代码:
```
let promises = [];
v.pics.forEach((u, i) => {
if (u.split('/')[0] == 'cloud:') {
} else {
wx.getFileSystemManager().getFileInfo({
filePath: u,
success: function (res) {
if (res.size > 200 * 1024) {
picCursor.push(i)
let promise = wx.compressImage({
src: u,
quality: 30,
}).then(res => {
return wx.cloud.uploadFile({
cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'),
filePath: res.tempFilePath,
})
})
promises.push(promise);
} else {
picCursor.push(i)
let promise = wx.cloud.uploadFile({
cloudPath: 'usersproducts/' + upID + Date.now() + (i + '.png'),
filePath: u,
})
promises.push(promise);
}
}
})
}
})
Promise.all(promises).then(res => {
// 上传图片的操作
})
```
这样就可以确保所有压缩操作完成后再执行上传操作,避免了异步操作导致的问题。
阅读全文