Skip to main content

微搭如何获取云存储文件的临时下载地址?

在微搭低代码平台中,当需要将云存储文件以邮件等方式发送时,可以通过获取临时下载链接来实现。

问题场景

您可能遇到以下需求:

  • 上传文件后,需要通过邮件发送该文件
  • 由于页面存储大小限制,不能直接发送文件内容
  • 需要通过临时链接让用户下载文件

解决方案

方案一:使用 $w.cloud.getTempFileURL(推荐)

在微搭中使用内置的 $w.cloud.getTempFileURL 方法获取临时链接:

// 获取单个文件的临时链接
async function getTempFileURL() {
const fileID = $w.uploadFile1.value; // 获取上传组件的文件ID

if (!fileID) {
console.error('请先上传文件');
return;
}

// 入参为字符串,返回值也是字符串
const tempUrl = await $w.cloud.getTempFileURL(fileID);
console.log('临时链接:', tempUrl);
return tempUrl;
}
// 获取多个文件的临时链接
async function getMultipleTempFileURLs(fileIDs) {
// 入参为数组,返回值是对象 {fileID: url}
const result = await $w.cloud.getTempFileURL(fileIDs);
console.log('临时链接:', result);
// result 格式:{ 'cloud://xxx/a.jpg': 'https://...', 'cloud://xxx/b.jpg': 'https://...' }
return result;
}

方案二:通过云函数获取临时链接

如果需要在云函数中处理,可以使用云开发 Node.js SDK。

// 云函数代码
const tcb = require('@cloudbase/node-sdk');

exports.main = async (event, context) => {
const app = tcb.init({
env: tcb.getCurrentEnv()
});

const { fileList } = event;

try {
const result = await app.getTempFileURL({
fileList: fileList
});

return {
errorCode: 0,
errorMessage: 'success',
fileList: result.fileList
};
} catch (error) {
return {
errorCode: 1,
errorMessage: error.message
};
}
};

然后在微搭中调用云函数:

// 调用云函数获取临时链接
async function getTempFileURLByCloudFunction(fileID) {
const result = await $w.cloud.callFunction({
name: 'getTempFileURL',
data: {
fileList: [fileID]
}
});

return result.result.fileList[0].tempFileURL;
}

常见错误

错误 1:STORAGE_FILE_NONEXIST

错误信息:

[cloud.getTempFileURL]single item failed {fileid: '$w.uploadFile1.value', code: 'STORAGE_FILE_NONEXIST', fileID: '$w.uploadFile1.value'}

原因:文件 ID 传成了字符串字面量,而不是实际的文件 ID 值。

解决:确保传入的是变量值,而不是字符串字面量。

// 错误写法:传成了字符串字面量
const tempUrl = await $w.cloud.getTempFileURL('$w.uploadFile1.value');

// 正确写法:传入变量值
const fileID = $w.uploadFile1.value; // 获取实际的文件ID
const tempUrl = await $w.cloud.getTempFileURL(fileID);

错误 2:SyntaxError: Cannot use import statement outside a module

错误信息:

{"errorCode":1,"errorMessage":"SyntaxError: Cannot use import statement outside a module",...}

原因:在云函数中使用了 ES6 的 import 语法,但运行环境不支持。

解决:使用 CommonJS 的 require 语法。

// 错误写法
import tcb from "@cloudbase/js-sdk";

// 正确写法
const tcb = require('@cloudbase/node-sdk');

注意事项

  1. 临时链接有效期:临时链接默认有效期为 2 小时,建议在使用时实时获取
  2. 文件 ID 格式:文件 ID 的格式为 cloud://环境ID.文件路径,确保格式正确
  3. 权限验证:确保调用临时链接 API 的用户有访问该文件的权限
  4. 返回值格式$w.cloud.getTempFileURL 入参为字符串时返回字符串,入参为数组时返回对象

相似问题

  1. 微搭如何获取云存储文件的下载地址?
  2. 微搭如何获取文件临时链接?
  3. 微搭上传文件后如何获取访问链接?
  4. 微搭如何通过邮件发送云存储文件?
  5. cloud.getTempFileURL 报 STORAGE_FILE_NONEXIST 错误?
  6. 微搭云存储临时链接有效期多久?
  7. 微搭如何获取上传文件的临时下载地址?
  8. 微搭文件上传后如何获取访问URL?
  9. 微搭云存储文件如何分享?
  10. 微搭云存储临时链接怎么用?

相关文档