午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    如何在移動(dòng)web上上傳文件..
    來(lái)源:易賢網(wǎng) 閱讀:2878 次 日期:2015-04-03 11:03:18
    溫馨提示:易賢網(wǎng)小編為您整理了“如何在移動(dòng)web上上傳文件..”,方便廣大網(wǎng)友查閱!

    xmlhttprequest2.0 可以支持文件上傳.這東東很方便,但是在實(shí)際使用中碰到了一些問(wèn)題.這里記錄下.

    正常情況下我們是這樣生成2進(jìn)制文件的.

    //data為文件的base64編碼

    function dataURLtoBlob(data) {

    var tmp = data.split(',');

    tmp[1] = tmp[1].replace(/s/g,'');

    var binary = atob(tmp[1]);

    var array = [];

    for(var i = 0; i < binary.length; i++) {

    array.push(binary.charCodeAt(i));

    }

    return new Blob([new Uint8Array(array)], {type: 'image/jpeg'});

    }

    但是在android手機(jī)上可能會(huì)由于沒有blob對(duì)象導(dǎo)致無(wú)法生成blob.怎么辦捏.可以使用以下代碼:

    function newBlob(data, datatype){

    var out;

    try {

    out = new Blob([data], {type: datatype});

    //一切正常,直接使用blob.

    } catch (e) {

    window.BlobBuilder = window.BlobBuilder ||

    window.WebKitBlobBuilder ||

    window.MozBlobBuilder ||

    window.MSBlobBuilder;

    if (e.name == 'TypeError' && window.BlobBuilder) {

    var bb = new BlobBuilder();

    bb.append(data.buffer);

    out = bb.getBlob(datatype);

    //還可以搶救一下..使用blobbuilder來(lái)生成文件..

    } else {

    //沒救了,放棄治療.

    }

    }

    return out;

    }

    ok.現(xiàn)在文件已經(jīng)ready了.

    我們創(chuàng)建一個(gè)formadata

    var file = dataURLtoBlob(img);

    fd.append('img',file);

    愉快的上傳….然后…然后…沒有然后了…抓包看下.

    ------WebKitFormBoundarysToAVAYMLPFfJF96

    Content-Disposition: form-data; name="img"; filename="blob"

    Content-Type: application/octet-stream

    ------WebKitFormBoundarysToAVAYMLPFfJF96--

    文件的內(nèi)容呢…

    好吧..既然沒法愉快用formdata..那么就自己動(dòng)手生成一個(gè)post的包體吧…下面是相關(guān)的代碼..

    function FormDataShim () {

    var o = this,

    parts = [],// Data to be sent

    boundary = Array(5).join('-') + (+new Date() * (1e16*Math.random())).toString(32),

    oldSend = XMLHttpRequest.prototype.send;

    this.append = function (name, value, filename) {

    parts.push('--' + boundary + 'rnContent-Disposition: form-data; name="' + name + '"');

    if (value instanceof Blob) {

    parts.push('; filename="'+ (filename || 'blob') +'"rnContent-Type: ' + value.type + 'rnrn');

    parts.push(value);

    } else {

    parts.push('rnrn' + value);

    }

    parts.push('rn');

    };

    //把xhr的send方法重寫一下.

    XMLHttpRequest.prototype.send = function (val) {

    var fr,

    data,

    oXHR = this;

    if (val === o) {

    // 最后加一下boundary..注意這里一定要在最后加rn..否則服務(wù)器有可能會(huì)解析參數(shù)失敗..

    parts.push('--' + boundary + '--rn');

    data = new XBlob(parts);

    fr = new FileReader();

    fr.onload = function () { oldSend.call(oXHR, fr.result); };

    fr.onerror = function (err) { throw err; };

    fr.readAsArrayBuffer(data);

    // 設(shè)置content-type

    this.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

    XMLHttpRequest.prototype.send = oldSend;

    }

    else {

    oldSend.call(this, val);

    }

    };

    }

    最后完整的代碼長(zhǎng)這樣.

    function newBlob(data, datatype){

    var out;

    try {

    out = new Blob([data], {type: datatype});

    }

    catch (e) {

    window.BlobBuilder = window.BlobBuilder ||

    window.WebKitBlobBuilder ||

    window.MozBlobBuilder ||

    window.MSBlobBuilder;

    if (e.name == 'TypeError' && window.BlobBuilder) {

    var bb = new BlobBuilder();

    bb.append(data.buffer);

    out = bb.getBlob(datatype);

    }

    else if (e.name == "InvalidStateError") {

    out = new Blob([data], {type: datatype});

    }

    else {

    }

    }

    return out;

    }

    // 判斷是否需要blobbuilder

    var needsFormDataShim = (function () {

    var bCheck = ~navigator.userAgent.indexOf('Android')

    && ~navigator.vendor.indexOf('Google')

    && !~navigator.userAgent.indexOf('Chrome');

    return bCheck && navigator.userAgent.match(/AppleWebKit/(d+)/).pop() <= 534;

    })(),

    blobConstruct = !!(function () {

    try { return new Blob(); } catch (e) {}

    })(),

    XBlob = blobConstruct ? window.Blob : function (parts, opts) {

    var bb = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder);

    parts.forEach(function (p) {

    bb.append(p);

    });

    return bb.getBlob(opts ? opts.type : undefined);

    };

    function FormDataShim () {

    // Store a reference to this

    var o = this,

    parts = [],// Data to be sent

    boundary = Array(5).join('-') + (+new Date() * (1e16*Math.random())).toString(32),

    oldSend = XMLHttpRequest.prototype.send;

    this.append = function (name, value, filename) {

    parts.push('--' + boundary + 'rnContent-Disposition: form-data; name="' + name + '"');

    if (value instanceof Blob) {

    parts.push('; filename="'+ (filename || 'blob') +'"rnContent-Type: ' + value.type + 'rnrn');

    parts.push(value);

    } else {

    parts.push('rnrn' + value);

    }

    parts.push('rn');

    };

    // Override XHR send()

    XMLHttpRequest.prototype.send = function (val) {

    var fr,

    data,

    oXHR = this;

    if (val === o) {

    //注意不能漏最后的rn ,否則有可能服務(wù)器解析不到參數(shù).

    parts.push('--' + boundary + '--rn');

    data = new XBlob(parts);

    fr = new FileReader();

    fr.onload = function () { oldSend.call(oXHR, fr.result); };

    fr.onerror = function (err) { throw err; };

    fr.readAsArrayBuffer(data);

    this.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

    XMLHttpRequest.prototype.send = oldSend;

    }

    else {

    oldSend.call(this, val);

    }

    };

    }

    //把圖片轉(zhuǎn)成formdata 可以使用的數(shù)據(jù)...

    //這里要把s替換掉..要不然atob的時(shí)候會(huì)出錯(cuò)....

    function dataURLtoBlob(data) {

    var tmp = data.split(',');

    tmp[1] = tmp[1].replace(/s/g,'');

    var binary = atob(tmp[1]);

    var array = [];

    for(var i = 0; i < binary.length; i++) {

    array.push(binary.charCodeAt(i));

    }

    return new newBlob(new Uint8Array(array), 'image/jpeg');

    }

    function uploadFile(img){

    var fd = needsFormDataShim ? new FormDataShim() : new FormData();

    var file = dataURLtoBlob(img);

    fd.append('img',file);

    var prog = function(e){

    /*你的邏輯*/

    }

    var load = function(e){

    /*你的邏輯*/

    }

    var error = function(e){

    /*你的邏輯*/

    }

    var abort = function(e){

    /*你的邏輯*/

    }

    var xhr = new XMLHttpRequest();

    xhr.upload.addEventListener('progress',prog,false);

    xhr.addEventListener('load',load,false);

    xhr.addEventListener('error',error,false);

    xhr.addEventListener('abort',abort,false);

    xhr.onreadystatechange = function(){

    /*你的邏輯*/

    }

    xhr.open('POST','/upload',true);

    xhr.send(fd);

    }

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看技術(shù)文章
    易賢網(wǎng)手機(jī)網(wǎng)站地址:如何在移動(dòng)web上上傳文件..
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國(guó)考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)