请问如何将uniapp这个临时的文件地址转换为Web API的File对象呢?

我们知道uniapp中一般选择文件,是存储的一个临时的地址:
例如:

"path": "blob:http://localhost:5173/fe79d681-85b7-4261-9e65-ba4d68cf0b83",

1、请问如何将这个临时的地址转换为Web API的File对象呢?
2、这个Web API的File对象,是否是微信小程序,支付宝小程序等使用axios上传时候都可以进行使用?

阅读 1.1k
avatarAI BotBETA

回答

  1. 如何将uniapp中的临时文件地址转换为Web API的File对象?

    在uni-app中,如果你有一个临时的文件地址(如blob:http://localhost:5173/fe79d681-85b7-4261-9e65-ba4d68cf0b83),你可以通过创建一个Blob对象并使用URL.createObjectURL(如果它本身不是一个Blob URL的话,但看起来这里已经是一个Blob URL了)或者通过fetch API来获取这个Blob数据,然后创建一个File对象。不过,由于你已经有一个Blob URL,你可以直接使用fetch来获取Blob数据,然后利用File构造函数创建File对象。

    async function blobUrlToFile(blobUrl) {
        const response = await fetch(blobUrl);
        const blob = await response.blob();
        const file = new File([blob], 'filename.ext', { type: blob.type }); // 替换'filename.ext'为实际文件名和扩展名
        return file;
    }
    
    // 使用示例
    blobUrlToFile("blob:http://localhost:5173/fe79d681-85b7-4261-9e65-ba4d68cf0b83")
        .then(file => console.log(file))
        .catch(error => console.error(error));

注意:这里的filename.ext需要你根据实际情况替换为正确的文件名和扩展名。

  1. 这个Web API的File对象,是否是微信小程序,支付宝小程序等使用axios上传时候都可以进行使用?

    在微信小程序、支付宝小程序等环境中,直接使用Web API(如File对象)通常是不可行的,因为这些小程序运行在特定的环境中,它们有自己的API和限制。例如,微信小程序使用wx.uploadFile方法上传文件,而支付宝小程序使用my.uploadFile。这些API通常需要你提供文件的路径(在小程序的文件系统中)和其他相关参数,而不是直接使用Web API的File对象。

    因此,如果你正在开发一个跨平台的小程序(如uni-app),你需要根据目标平台(微信小程序、支付宝小程序等)的文档来适配文件上传的逻辑,而不是依赖于Web API的File对象。

    对于uni-app,你可以使用条件编译来针对不同的平台实现不同的文件上传逻辑。

2 个回答

小程需要用微信的文件上传API,然后选择好文件之后返回一个临时地址,直接请求后端就好了。
并不是之前你开发web时使用 input:file 选择文件后获取到 blob 对象然后通过 axios + multipart/form-data 来上传文件。

具体看微信文档 👇

支付宝小程序应该也是类似的情况。但是看你是使用的 uni-app 开发,所以看这里 👉 uni.uploadFile(OBJECT) | uni-app官网

UniApp 中实现将临时文件地址转换为 Web API 的 File 对象,并在微信小程序和支付宝小程序中使用 axios 上传:

1. 将临时地址转换为 File 对象

首先,通过 fetch API 获取 Blob 数据,然后创建 File 对象:

async function urlToFile(url, filename, mimeType) {
  const response = await fetch(url);
  const blob = await response.blob();
  return new File([blob], filename, { type: mimeType });
}

// 示例使用
const tempUrl = "blob:http://localhost:5173/fe79d681-85b7-4261-9e65-ba4d68cf0b83";
urlToFile(tempUrl, "example.png", "image/png").then(file => {
  console.log(file);
});

2. 在微信小程序和支付宝小程序中使用 File 对象上传

微信小程序

通过 wx.uploadFile 接口上传文件:

wx.chooseImage({
  success: function(res) {
    const tempFilePath = res.tempFilePaths[0];
    wx.uploadFile({
      url: 'https://example.com/upload', // 上传接口地址
      filePath: tempFilePath,
      name: 'file',
      success: function(uploadRes) {
        console.log('上传成功', uploadRes);
      },
      fail: function(err) {
        console.error('上传失败', err);
      }
    });
  }
});

支付宝小程序

通过 my.uploadFile 接口上传文件:

my.chooseImage({
  success: function(res) {
    const tempFilePath = res.apFilePaths[0];
    my.uploadFile({
      url: 'https://example.com/upload', // 上传接口地址
      filePath: tempFilePath,
      name: 'file',
      success: function(uploadRes) {
        console.log('上传成功', uploadRes);
      },
      fail: function(err) {
        console.error('上传失败', err);
      }
    });
  }
});

3. 使用 axios 上传文件

如果你需要在 Web 环境中使用 axios 上传文件,可以直接使用 FormData 对象:

const formData = new FormData();
formData.append('file', file);

axios.post('https://example.com/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
}).then(response => {
  console.log('上传成功', response);
}).catch(error => {
  console.error('上传失败', error);
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏