2013-02-22 28 views
5

Vì Blobbuilder không được dùng nữa và gần đây tôi đã quyết định sử dụng API nhận dạng khuôn mặt mới, tôi đang gặp khó khăn khi chuyển sang chỉ "đốm".Làm thế nào để thay thế BlobBuilder không được chấp nhận bằng hàm tạo Blob mới?

function dataURItoBlob(dataURI, callback) { 
     // convert base64 to raw binary data held in a string 
     // doesn't handle URLEncoded DataURIs 

     var byteString; 
     if (dataURI.split(',')[0].indexOf('base64') >= 0) { 
      byteString = atob(dataURI.split(',')[1]); 
     } else { 
      byteString = unescape(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); 
     } 

     // write the ArrayBuffer to a blob, and you're done 
     var BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder; 
     var bb = new BlobBuilder(); 
     bb.append(ab); 
     return bb.getBlob(mimeString); 
} 

Tôi đã cố gắng chuyển đổi nó sang chỉ:

 // write the ArrayBuffer to a blob, and you're done 
     var Blob = window.URL || window.webkitURL; 
     var bb = new Blob(); 

     /*var link = document.createElement('link'); 
     link.rel = 'stylesheet'; 
     link.href = window.URL.createObjectURL(blob); 
     document.body.appendChild(link);*/ 

     /*var BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder; 
     var bb = new BlobBuilder(); 
     bb.append(ab);*/ 
     return bb.getBlob(mimeString); 
} 

Nhưng tôi tiếp tục nhận được Uncaught TypeError: Object #<URL> has no method 'getBlob' trong giao diện điều khiển. Không chắc chắn những gì tôi đang thiếu. Nếu tôi cố gắng sử dụng bb.append(ab); tôi nhận được Uncaught TypeError: Object #<Blob> has no method 'append' trong bảng điều khiển.

Trả lời

13

Chuyển đổi từ BlobBuilder thành Blob khá đơn giản. Hãy thử các mã tương thích ngược sau (những thứ trong khối catch là mã ban đầu của bạn):

... 
    try { 
     return new Blob([ab], {type: mimeString}); 
    } catch (e) { 
     // The BlobBuilder API has been deprecated in favour of Blob, but older 
     // browsers don't know about the Blob constructor 
     // IE10 also supports BlobBuilder, but since the `Blob` constructor 
     // also works, there's no need to add `MSBlobBuilder`. 
     var BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder; 
     var bb = new BlobBuilder(); 
     bb.append(ab); 
     return bb.getBlob(mimeString); 
    } 
} 
+0

Trong bản cập nhật bài đăng của tôi, tôi đã thử mã của bạn và nhận được 'Loại lỗi không xác định: không xác định không phải là chức năng' – shayward

+0

@shayward Sử dụng mã trong câu trả lời của tôi mà không có bất kỳ sửa đổi nào: Lấy chức năng ban đầu của bạn và thay thế dòng cuối cùng ('var BlobBuilder ......}') với mã của tôi. –

+0

Cảm ơn các công trình, chỉ là một lỗi sau khi gõ: mimeString. Thiếu khung đóng. Nhưng trong tương lai, điều này có bị loại bỏ không? – shayward

4
Blob = (function() { 
    var nativeBlob = Blob; 

    // Add unprefixed slice() method. 
    if (Blob.prototype.webkitSlice) { 
    Blob.prototype.slice = Blob.prototype.webkitSlice; 
    } 
    else if (Blob.prototype.mozSlice) { 
    Blob.prototype.slice = Blob.prototype.mozSlice; 
    } 

    // Temporarily replace Blob() constructor with one that checks support. 
    return function(parts, properties) { 
    try { 
     // Restore native Blob() constructor, so this check is only evaluated once. 
     Blob = nativeBlob; 
     return new Blob(parts || [], properties || {}); 
    } 
    catch (e) { 
     // If construction fails provide one that uses BlobBuilder. 
     Blob = function (parts, properties) { 
     var bb = new (WebKitBlobBuilder || MozBlobBuilder), i; 
     for (i in parts) { 
      bb.append(parts[i]); 
     } 
     return bb.getBlob(properties && properties.type ? properties.type : undefined); 
     }; 
    }   
    }; 
}()); 

Bao gồm này trước khi bạn sẽ sử dụng Blobs và bạn sẽ có thể sử dụng nhà thầu Blob trong các trình duyệt chỉ hỗ trợ BlobBuilder không dùng nữa.

+1

Có thể hữu ích khi thêm một vài nhận xét khác để làm rõ điều từng phần đang làm. – Thomas

+0

Một cái gì đó như thế này? – casey

+1

Yea, điều này sẽ giúp ích cho những người khác trong tương lai. – Thomas

Các vấn đề liên quan