90

参考:FileReader.readAsDataURL

考虑以下示例:

function previewFile(file) {

  var reader  = new FileReader();

  reader.onloadend = function () {
    console.log(reader.result);
  }
  reader.readAsDataURL(file);
}

它指出:

instanceOfFileReader.readAsDataURL(blob);

blob:要从中读取的 Blob 或文件。

  1. 如何将本地文件 URL(如'file:///C:/path-to/root.png':)传递给readAsDataURL()

  2. FileReader()在 Firefox 插件中可用吗?

4

8 回答 8

67

要将 URL 转换为 FileReader.readAsDataURL() 的 Blob,请执行以下操作:

var request = new XMLHttpRequest();
request.open('GET', MY_URL, true);
request.responseType = 'blob';
request.onload = function() {
    var reader = new FileReader();
    reader.readAsDataURL(request.response);
    reader.onload =  function(e){
        console.log('DataURL:', e.target.result);
    };
};
request.send();
于 2017-01-19T21:37:05.060 回答
44

扩展 Felix Turner 的响应,这是我将如何将这种方法与fetchAPI 一起使用。

async function createFile(){
  let response = await fetch('http://127.0.0.1:8080/test.jpg');
  let data = await response.blob();
  let metadata = {
    type: 'image/jpeg'
  };
  let file = new File([data], "test.jpg", metadata);
  // ... do something with the file or return it
}
createFile();
于 2018-12-02T19:51:46.357 回答
19

对于@tibor-udvari的出色获取答案,建议的编辑队列已满,因此我会将建议的编辑作为新答案发布。

如果返回,此函数从标头获取内容类型,否则返回可设置的默认类型。

async function getFileFromUrl(url, name, defaultType = 'image/jpeg'){
  const response = await fetch(url);
  const data = await response.blob();
  return new File([data], name, {
    type: data.type || defaultType,
  });
}

// `await` can only be used in an async body, but showing it here for simplicity.
const file = await getFileFromUrl('https://example.com/image.jpg', 'example.jpg');
于 2020-09-23T10:06:32.357 回答
17

试试这个,当我在转换为 ico 时,我从 @nmaier 那里学到了这一点:好吧,我真的不明白数组缓冲区是什么,但它可以满足我们的需要:

function previewFile(file) {

  var reader  = new FileReader();

  reader.onloadend = function () {
    console.log(reader.result); //this is an ArrayBuffer
  }
  reader.readAsArrayBuffer(file);
}

请注意我刚刚将您的更改readAsDataURLreadAsArrayBuffer.

这是@nmaier 给我的例子: https ://stackoverflow.com/a/24253997/1828637

它有一个小提琴

如果您想使用它并从中制作一个文件,我认为您会在onloadend

于 2014-07-30T20:38:25.053 回答
16

该信息截至目前已过时,但无法删除。

  1. 当您的代码具有 chrome 权限时,您只需指定路径即可创建File实例:

    new File("/path/to/file");
    

    File是 的子类Blob,因此所有File实例也是有效Blob的 s。请注意,这需要平台路径,而不是文件 URL

  2. 是的,FileReader可用于插件。

File并且FileReader在所有windows 中都可用。如果您想在非窗口范围(如bootstrap.js或代码模块)中使用它们,您可以使用nsIDOMFile/ nsIDOMFileReader

于 2014-07-30T20:42:34.473 回答
5

这是我使用异步等待和承诺的代码

const getBlobFromUrl = (myImageUrl) => {
    return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest();
        request.open('GET', myImageUrl, true);
        request.responseType = 'blob';
        request.onload = () => {
            resolve(request.response);
        };
        request.onerror = reject;
        request.send();
    })
}

const getDataFromBlob = (myBlob) => {
    return new Promise((resolve, reject) => {
        let reader = new FileReader();
        reader.onload = () => {
            resolve(reader.result);
        };
        reader.onerror = reject;
        reader.readAsDataURL(myBlob);
    })
}

const convertUrlToImageData = async (myImageUrl) => {
    try {
        let myBlob = await getBlobFromUrl(myImageUrl);
        console.log(myBlob)
        let myImageData = await getDataFromBlob(myBlob);
        console.log(myImageData)
        return myImageData;
    } catch (err) {
        console.log(err);
        return null;
    }
}

export default convertUrlToImageData;
于 2020-05-06T17:31:50.290 回答
2

我知道这是对@tibor-udvari 答案的扩展,但是为了更好地复制和粘贴。

async function createFile(url, type){
  if (typeof window === 'undefined') return // make sure we are in the browser
  const response = await fetch(url)
  const data = await response.blob()
  const metadata = {
    type: type || 'video/quicktime'
  }
  return new File([data], url, metadata)
}
于 2020-09-11T16:33:41.143 回答
-1

这是使用 vanila.js 和 promise 获取 blob 或文件对象的最简单方法

const fileURL_to_blob = (file_url) => {
  return new Promise((resolve, reject) => {
    let request = new XMLHttpRequest();
    request.open('GET', file_url, true);
    request.responseType = 'blob';
    request.onload = function() {
        var reader = new FileReader();
        reader.readAsDataURL(request.response);
        reader.onload =  function(e){
            //console.log('DataURL:', e.target.result);
            resolve(e.target.result);
        };
    };
    request.onerror=function(e){
      reject(e);
    }
    request.send();
  });
}
于 2022-01-05T08:09:24.257 回答