ionic3 上傳圖片互订、壓縮圖片到阿里云 服務(wù)端簽名后直傳

1.為什么用plupload.js
首先使用這個(gè)plupload是因?yàn)槲也捎玫?【阿里云 服務(wù)端簽名后直傳】,使用的是這個(gè)方法痘拆。
放上阿里云的地址:https://help.aliyun.com/document_detail/31926.html?spm=a2c4g.11174283.6.634.PYDsbd

2.關(guān)于plupload.js
大致有以下幾個(gè)參數(shù):

      runtimes: 'html5,flash,silverlight,html4', // 用來指定上傳方式
      browse_button: 'selectfiles', // 觸發(fā)文件選擇對(duì)話框的DOM元素
      multi_selection: false, // 是否可以在文件瀏覽對(duì)話框中選擇多個(gè)文件仰禽,true為可以,false為不可以
      container: document.getElementById('container'), // 用來指定Plupload所創(chuàng)建的html結(jié)構(gòu)的父容器
      url: '*******', // 服務(wù)器端接收和處理上傳文件的腳本地址
      filters: {
        mime_types: [ // 用來限定上傳文件的類型
          { title: "Image files", extensions: "jpg,jpeg,gif,png,bmp" },
        ],
        max_file_size: '10mb', // 用來限定上傳文件的大小
        prevent_duplicates: true, // 是否允許選取重復(fù)的文件纺蛆,為true時(shí)表示不允許吐葵,為false時(shí)表示允許,默認(rèn)為false桥氏。如果兩個(gè)文件的文件名和大小都相同温峭,則會(huì)被認(rèn)為是重復(fù)的文件
      },
      resize: { // 壓縮
        width:1000,
        height:800字支,
        crop: false,
        quality: 90,
        preserve_headers: false
      },

大致的事件:

Init // 當(dāng)Plupload初始化完成后觸發(fā)
PostInit // 當(dāng)Init事件發(fā)生后觸發(fā)
FilesAdded // 當(dāng)文件添加到上傳隊(duì)列后觸發(fā)
BeforeUpload // 當(dāng)隊(duì)列中的某一個(gè)文件正要開始上傳前觸發(fā)
UploadProgress // 顯示上傳進(jìn)度
FileUploaded  // 當(dāng)隊(duì)列中的某一個(gè)文件上傳完成后觸發(fā)
Error  // 錯(cuò)誤

以上是我用到的凤藏,大家可以根據(jù)自己的需求去添加。具體可參考博客:https://www.cnblogs.com/2050/p/3913184.html堕伪。
寫的很詳細(xì)了揖庄,我也是參考這個(gè)博客的,對(duì)plupload有了進(jìn)一步認(rèn)識(shí)刃跛。

3.使用
html:

<img class="photo" src="{{photourl}}" alt="">
<div id="ossfile" class="ossfile"></div>
<div id="container" class="upload_btn">
     <button ion-button icon-only id="selectfiles">選擇文件</button>
     <button ion-button icon-only id="postfiles">開始上傳</button>
</div>

ts:

set_upload_param(up, filename) {
    let token = ********;
    ***********.subscribe((body: any) => {
    // 這里是我向后臺(tái)發(fā)送的請(qǐng)求 獲取到需要上傳給 阿里云的數(shù)據(jù)
        let new_multipart_params = {
          'key': dir + '${filename}',
          'policy':policy,
          'OSSAccessKeyId':accessid,
          'success_action_status': '200', //讓服務(wù)端返回200,不然抠艾,默認(rèn)會(huì)返回204
          'signature': signature,
          'x-oss-object-acl': 'public-read'
        };
        up.setOption({
          'url': host,
          'multipart_params': new_multipart_params
        });
        up.start();
      }
    })
  }

  uploadImg() {
  // 這里需要注意 this 的指向問題
    let that = this;
    this.uploader = new plupload.Uploader({
      runtimes: 'html5,flash,silverlight,html4',
      browse_button: 'selectfiles', 
      multi_selection: false, 
      container: document.getElementById('container'), 
      url: '*******', 
      filters: {
        mime_types: [ 
          { title: "Image files", extensions: "jpg,jpeg,gif,png,bmp" },
        ],
        max_file_size: '10mb', 
        prevent_duplicates: true, 
      },
      resize: { 
        crop: false,
        quality: 90,
        preserve_headers: false
      },

      init: {
        PostInit: function () {
          document.getElementById('postfiles').onclick = function () {
            that.set_upload_param(that.uploader, '');
            return false;
          };
        },

        FilesAdded: function (up, files) {
          document.getElementById('ossfile').innerHTML = '';
          plupload.each(files, function (file) {
            document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + '(' + file.name + ')<b></b>'
              + '<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
              + '</div>';
          });

          // 這里【重點(diǎn)】:獲取圖片的原始尺寸來進(jìn)行計(jì)算 壓縮的尺寸
          // 我這里設(shè)置的寬1000苛萎,高800 
          let image = new Image();
          let reader = new FileReader();
          reader.onload = (readerEvent: any) => {
            image.onload = () => {
              let originalWidth = image.width; // 原始圖片的寬
              let originalHeight = image.height; // 原始圖片的高
              if (originalWidth >= 1000) {
                that.uploader.settings.resize.width = 1000;
                that.uploader.settings.resize.height = Math.floor(originalHeight * (that.uploader.settings.resize.width / originalWidth));
                if (that.uploader.settings.resize.height > 800) {
                  that.uploader.settings.resize.width = Math.floor(that.uploader.settings.resize.width * (800 / that.uploader.settings.resize.height));
                  that.uploader.settings.resize.height = 800;
                }
              }
              else if (originalHeight > 800) {
                that.uploader.settings.resize.height = 800;
                that.uploader.settings.resize.width = Math.floor(originalWidth * (that.uploader.settings.resize.height / originalHeight));
              }
              else {
                that.uploader.settings.resize.width = originalWidth;
                that.uploader.settings.resize.height = originalHeight;
              }
            };
            image.src = readerEvent.target.result;
          };
          reader.readAsDataURL(files[0].getNative());
        },

        BeforeUpload: function (up, file) {
          that.set_upload_param(up, file.name);
        },

        UploadProgress: function (up, file) {
          var d = document.getElementById(file.id);
          d.getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
          var prog = d.getElementsByTagName('div')[0];
          var progBar = prog.getElementsByTagName('div')[0]
          progBar.style.width = 2 * file.percent + 'px';
          progBar.setAttribute('aria-valuenow', file.percent);
        },

        FileUploaded: function (up, file, info) {
          if (info.status == 200) {
            that.appStatus.infoMsg('上傳成功');
            // 這一步是 上傳成功后桨昙,清除進(jìn)度條
            document.getElementById('ossfile').innerHTML = '';
          }
          else if (info.status == 203) {
            console.log('上傳到OSS成功,但是oss訪問用戶設(shè)置的上傳回調(diào)服務(wù)器失敗');
            console.log('失敗原因是:' + info.response);
          }
          else {
            console.log('失敗原因是:' + info.response);
          }
        },

        Error: function (up, err) {
          if (err.code == -600) {
            that.appStatus.infoMsg("選擇的文件太大了腌歉!")
          }
          else if (err.code == -601) {
            that.appStatus.infoMsg("選擇的上傳文件類型不對(duì)蛙酪!")
          }
          else if (err.code == -602) {
            that.appStatus.infoMsg("這個(gè)文件已經(jīng)選擇過一遍了!")
          }
          else {
            console.log(err.response)
          }
        }
      }
    });
    this.uploader.init();
  }

【重點(diǎn)】:

  1. this的指向問題
  2. resize的寬高動(dòng)態(tài)賦值需要是:uploader.settings.resize.width 翘盖、uploader.settings.resize.height
  3. resize只給寬桂塞,比如
    resize: {
    width:800,
    crop: false,
    quality: 90,
    preserve_headers: false
    },
    這個(gè)能實(shí)現(xiàn)壓縮馍驯,圖片體積可以壓縮阁危,寬高可以不進(jìn)行剪裁 同比例縮小玛痊。圖片大于800進(jìn)行壓縮,小于不壓縮狂打。我的需求是限定了高擂煞,所以要進(jìn)行計(jì)算。
  4. 案例上的進(jìn)度條是 同時(shí)存在多個(gè)趴乡。我的需求是 只顯示一個(gè)对省,成功后消失。具體代碼是:
FilesAdded: function (up, files) {
          document.getElementById('ossfile').innerHTML = '';
          plupload.each(files, function (file) {
            document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + '(' + file.name + ')<b></b>'
              + '<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
              + '</div>';
          });
}

FileUploaded: function (up, file, info) {
          if (info.status == 200) {
            that.appStatus.infoMsg('上傳成功');
            // 這一步是 上傳成功后晾捏,清除進(jìn)度條
            document.getElementById('ossfile').innerHTML = '';
          }
}

這個(gè)實(shí)現(xiàn)了我的需求蒿涎,還有許多不足之處,大家可以做個(gè)參考惦辛!

最后給大家看下我的頁面效果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劳秋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胖齐,更是在濱河造成了極大的恐慌俗批,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件市怎,死亡現(xiàn)場(chǎng)離奇詭異岁忘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)区匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門干像,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驰弄,你說我怎么就攤上這事麻汰。” “怎么了戚篙?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵五鲫,是天一觀的道長。 經(jīng)常有香客問我岔擂,道長位喂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任乱灵,我火速辦了婚禮塑崖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痛倚。我一直安慰自己规婆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抒蚜,像睡著了一般掘鄙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗡髓,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天通铲,我揣著相機(jī)與錄音,去河邊找鬼器贩。 笑死颅夺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛹稍。 我是一名探鬼主播吧黄,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唆姐!你這毒婦竟也來了拗慨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤奉芦,失蹤者是張志新(化名)和其女友劉穎赵抢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體声功,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烦却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了先巴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片其爵。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伸蚯,靈堂內(nèi)的尸體忽然破棺而出摩渺,到底是詐尸還是另有隱情,我是刑警寧澤剂邮,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布摇幻,位于F島的核電站,受9級(jí)特大地震影響挥萌,放射性物質(zhì)發(fā)生泄漏绰姻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一瑞眼、第九天 我趴在偏房一處隱蔽的房頂上張望龙宏。 院中可真熱鬧,春花似錦伤疙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至双饥,卻和暖如春危号,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歹啼。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔曲。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像劈愚,于是被迫代替她去往敵國和親瞳遍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 公司讓我使用阿里云OSS服務(wù)器菌羽,上傳其實(shí)很快就搞定了掠械,但是一直搞不懂我上傳上去的文件如何下載,翻閱了好多好多資料和...
    勿忘心安0521閱讀 1,913評(píng)論 0 1
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案注祖? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,759評(píng)論 1 92
  • 邵陽。我叫周邵陽罩缴。 他們說我傻案糙,我呵呵呵的笑,他們就說瞧他那傻樣靴庆,一家子沒一個(gè)正常的时捌。其實(shí),他們錯(cuò)了炉抒,我聽外...
    獨(dú)孤赤白閱讀 373評(píng)論 2 3
  • 陳厚皮 跟一群可愛的人兒
    白萌主閱讀 162評(píng)論 0 0
  • 世界第一可愛小仙女: 不知不覺奢讨,已經(jīng)在一起一個(gè)月了。在這段說長不長焰薄,說短不短的時(shí)間拿诸,我們經(jīng)歷了很多很多,度過了許多...
    呆萌呆閱讀 149評(píng)論 0 0