简体   繁体   English

如何将dataURL转换为javascript中的文件object?

[英]How to convert dataURL to file object in javascript?

I need to convert a dataURL to a File object in Javascript in order to send it over using AJAX. Is it possible?我需要将 dataURL 转换为 Javascript 中的文件 object,以便使用 AJAX 发送它。这可能吗? If yes, please tell me how.如果是,请告诉我如何。

If you need to send it over ajax, then there's no need to use a File object, only Blob and FormData objects are needed.如果需要通过 ajax 发送,则不需要使用File对象,只需要BlobFormData对象。

As I sidenote, why don't you just send the base64 string to the server over ajax and convert it to binary server-side, using PHP's base64_decode for example?正如我旁注的那样,您为什么不通过 ajax 将 base64 字符串发送到服务器并将其转换为二进制服务器端,例如使用 PHP 的base64_decode Anyway, the standard-compliant code from this answer works in Chrome 13 and WebKit nightlies:无论如何, 这个答案中符合标准的代码适用于 Chrome 13 和 WebKit nightlies:

function dataURItoBlob(dataURI) {
    // convert base64 to raw binary data held in a string
    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
    var byteString = atob(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

    // write the bytes of the string to an ArrayBuffer
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    //Old Code
    //write the ArrayBuffer to a blob, and you're done
    //var bb = new BlobBuilder();
    //bb.append(ab);
    //return bb.getBlob(mimeString);

    //New Code
    return new Blob([ab], {type: mimeString});


}

Then just append the blob to a new FormData object and post it to your server using ajax:然后只需将 blob 附加到一个新的 FormData 对象并使用 ajax 将其发布到您的服务器:

var blob = dataURItoBlob(someDataUrl);
var fd = new FormData(document.forms[0]);
var xhr = new XMLHttpRequest();

fd.append("myFile", blob);
xhr.open('POST', '/', true);
xhr.send(fd);

The BlobBuilder is deprecated and should no longer be used.BlobBuilder已弃用,不应再使用。 Use Blob instead of old BlobBuilder.使用Blob而不是旧的 BlobBuilder。 The code is very clean and simple.代码非常干净和简单。

File object is inherit from Blob object. File 对象继承自 Blob 对象。 You can use both of them with FormData object.您可以将它们都与 FormData 对象一起使用。

function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

use dataURLtoBlob() function to convert dataURL to blob and send ajax to server.使用 dataURLtoBlob() 函数将 dataURL 转换为 blob 并将 ajax 发送到服务器。

for example:例如:

var dataurl = 'data:text/plain;base64,aGVsbG8gd29ybGQ=';
var blob = dataURLtoBlob(dataurl);
var fd = new FormData();
fd.append("file", blob, "hello.txt");
var xhr = new XMLHttpRequest();
xhr.open('POST', '/server.php', true);
xhr.onload = function(){
    alert('upload complete');
};
xhr.send(fd);

Another way:其他方式:

You can also use fetch to convert an url to a file object (file object has name/fileName property, this is different from blob object)您还可以使用fetch将 url 转换为文件对象(文件对象具有 name/fileName 属性,这与 blob 对象不同)

The code is very short and easy to use.代码非常简短且易于使用。 (works in Chrome and Firefox)

//load src and convert to a File instance object
//work for any type of src, not only image src.
//return a promise that resolves with a File instance

function srcToFile(src, fileName, mimeType){
    return (fetch(src)
        .then(function(res){return res.arrayBuffer();})
        .then(function(buf){return new File([buf], fileName, {type:mimeType});})
    );
}

Usage example 1: Just convert to file object用法示例1:只需转换为文件对象

srcToFile(
    'data:text/plain;base64,aGVsbG8gd29ybGQ=',
    'hello.txt',
    'text/plain'
)
.then(function(file){
    console.log(file);
})

Usage example 2: Convert to file object and upload to server使用示例2:转换为文件对象并上传到服务器

srcToFile(
    'data:text/plain;base64,aGVsbG8gd29ybGQ=',
    'hello.txt',
    'text/plain'
)
.then(function(file){
    console.log(file);
    var fd = new FormData();
    fd.append("file", file);
    return fetch('/server.php', {method:'POST', body:fd});
})
.then(function(res){
    return res.text();
})
.then(console.log)
.catch(console.error)
;

To create a blob from a dataURL:要从 dataURL 创建 blob:

const blob = await (await fetch(dataURL)).blob(); 

To create a file from a blob:要从 blob 创建文件:

const file = new File([blob], 'fileName.jpg', {type:"image/jpeg", lastModified:new Date()});

If you really want to convert the dataURL into File object.如果您真的想将 dataURL 转换为File对象。

You need to convert the dataURL into Blob then convert the Blob into File .您需要将 dataURL 转换为Blob然后将Blob转换为File The function is from answer by Matthew.该功能来自马修的回答。 ( https://stackoverflow.com/a/7261048/13647044 ) ( https://stackoverflow.com/a/7261048/13647044 )

function dataURItoBlob(dataURI) {
      // convert base64 to raw binary data held in a string
      // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
      var byteString = atob(dataURI.split(',')[1]);

      // separate out the mime component
      var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

      // write the bytes of the string to an ArrayBuffer
      var ab = new ArrayBuffer(byteString.length);
      var ia = new Uint8Array(ab);
      for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
      }
      return new Blob([ab], { type: mimeString });
    }

const blob = dataURItoBlob(url);
const resultFile = new File([blob], "file_name");

Other than that, you can have options on the File Object initialised.除此之外,您可以在初始化的File对象上设置选项。 Reference to File() constructor.对 File() 构造函数的引用

const resultFile = new File([blob], "file_name",{type:file.type,lastModified:1597081051454});

The type should be [MIME][1] type(ie image/jpeg ) and last modified value in my example is equivalent to Mon Aug 10 2020 19:37:31 GMT+0200 (Eastern European Standard Time)类型应该是[MIME][1]类型(即image/jpeg ),在我的例子中最后修改的值相当于Mon Aug 10 2020 19:37:31 GMT+0200 (Eastern European Standard Time)

In Latest browsers:在最新的浏览器中:

 const dataURLtoBlob = (dataURL) => { fetch(dataURL).then(res => res.blob()).then(blob => console.log(blob)).catch(err => console.log(err)) }

After some research I arrived on this one:经过一番研究,我得到了这个:

 function dataURItoBlob(dataURI) { // convert base64 to raw binary data held in a string // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this var byteString = atob(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to an ArrayBuffer var ab = new ArrayBuffer(byteString.length); var dw = new DataView(ab); for(var i = 0; i < byteString.length; i++) { dw.setUint8(i, byteString.charCodeAt(i)); } // write the ArrayBuffer to a blob, and you're done return new Blob([ab], {type: mimeString}); } module.exports = dataURItoBlob;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM