この記事では主に Vue.js 2.0 のモバイル カメラ圧縮画像アップロード プレビュー機能を紹介します。これは非常に優れており、必要な友人は参考にしてください。
Vue.js を学習して使用する過程でいくつかの問題に遭遇しました。 2.0 とはいくつかの違いがあります。当初、H5 アプリケーションはモバイル側で開発されており、mui フレームワークと Vue.js+vue-router+vuex ファミリー バケットを組み合わせる予定でした。アップロード時に、plus の H5+ インターフェースが呼び出せない問題が発生したため、最終的には入力ファイル方式を使用して写真アップロード機能を解決しました。しかし、プロジェクトの進行状況とバージョンの繰り返しにより、将来的にはこの機能の実装を諦めなければならない可能性があります。
まず、この写真のプレビュー、圧縮、アップロードの実装のアイデアについて話させてください。正確には、写真を撮った後、または画像圧縮を選択した後にプレビューしてアップロードするプロセスであるはずです。毎回写真を撮るか画像を選択し、画像を圧縮してプレビューしてアップロードします。アップロードされた画像圧縮プラグインは localResizeIMG です。このプラグインの使用手順は wiki にあります。基本原理は、canvas を通じて画像をレンダリングし、toDataURL メソッドを通じてそれを Base64 文字列に圧縮して保存することです。 (jpg 形式の画像にコンパイルできます) iOS で 2MB の写真を撮って圧縮すると、歪みはそれほど深刻ではありません。 、写真ははっきりと見えます。私が投稿したコードでの使用のデモンストレーションもあります。
<template> <h5 id="图片列表">图片列表</h5> <p class="image-list"> <p class="list-default-img" v-show="isPhoto" @click.stop="addPic"> <img src="/static/imghwm/default1.png" data-src="./images/icon_photo.png" class="lazy" / alt="Vue.js 2.0 モバイル側カメラ圧縮画像アップロードプレビュー機能の実装" > <span>请选择或者拍照上传照片</span> <input type="file" accept="image/jpeg,image/jpg,image/png" capture="camera" @change="onFileChange" style="display: none;"> </p> <ul class="list-ul" v-show="!isPhoto"> <li class="list-li" v-for="(iu, index) in imgUrls"> <a class="list-link" @click='previewImage(iu)'> <img src="/static/imghwm/default1.png" data-src="iu" class="lazy" : alt="Vue.js 2.0 モバイル側カメラ圧縮画像アップロードプレビュー機能の実装" > </a> <span class="list-img-close" @click='delImage(index)'></span> </li> <li class="list-li-add"> <span class="add-img" @click.stop="addPic"></span> </li> </ul> </p> <p class="add-preview" v-show="isPreview" @click="closePreview"> <img src="/static/imghwm/default1.png" data-src="previewImg" class="lazy" : alt="Vue.js 2.0 モバイル側カメラ圧縮画像アップロードプレビュー機能の実装" > </p> </template> <script> export default { data: function () { return { imgUrls: [], urlArr: [], isPhoto: true, btnTitle: '', isModify: false, previewImg:'', isPreview: false } }, watch: { imgUrls: 'toggleAddPic' }, methods: { toggleAddPic: function() { let vm = this; if(vm.imgUrls.length >= 1) { vm.isPhoto = false; } else { vm.isPhoto = true; } }, addPic: function(e) { let vm = this; $('input[type=file]').trigger('click'); return false; }, onFileChange: function(e) { var files = e.target.files || e.dataTransfer.files; if(!files.length) return; this.createImage(files, e); }, createImage: function(file, e) { let vm = this; lrz(file[0], { width: 480 }).then(function(rst) { vm.imgUrls.push(rst.base64); return rst; }).always(function() { // 清空文件上传控件的值 e.target.value = null; }); }, delImage: function(index) { let vm = this; let btnArray = ['取消', '确定']; mui.confirm('确定删除该图片?','提示', btnArray, function(e) { if (e.index == 1) { vm.imgUrls.splice(index, 1); } }) }, previewImage: function(url){ let vm = this; vm.isPreview = true; vm.previewImg = url; }, closePreview: function(){ let vm = this; vm.isPreview = false; vm.previewImg = ""; }, saveImage: function(){ let vm = this; let urlArr = [], imgUrls = this.imgUrls; for(let i = 0; i < imgUrls.length; i++) { if(imgUrls[i].indexOf('file') == -1) { urlArr.push(imgUrls[i].split(',')[1]); } else { urlArr.push(imgUrls[i]); } } //数据传输操作 } } } </script>
1. クリックして写真を撮るか、写真を選択します addPic
vue.js での写真の撮影の開始と写真の選択は、一度に 1 枚だけ行うことができます。複数の写真をアップロードするには、クリックを使用します。イベントは .stop 修飾子を使用して追加され、バブリングを停止するために .stop -event.stopPropagation() が呼び出されます。 Accept は、ファイルのアップロードを通じて送信されるファイルのタイプを指定します。Capture は、WebApp のシステムによってキャプチャされるデフォルトのデバイスです。
写真撮影アクションがトリガーされたら、変更イベント onFileChange をバインドしてファイル file オブジェクトを取得し、lrz メソッドを呼び出して画像を圧縮し、base64 形式に基づいた画像を imgUrls 配列に追加します。
lrz(file[0], { width: 480 }).then(function(rst) { vm.imgUrls.push(rst.base64); return rst; }).always(function() { // 清空文件上传控件的值 e.target.value = null; }); lrz(file, [options]);
file: input:file を通じて取得されるか、画像パスに直接渡されるファイル。
[オプション]: このパラメータは無視できます。
width {Number} 画像の最大幅。デフォルトは元の画像の幅です。
height {Number} 上と同じです。圧縮品質、値 0 ~ 1、デフォルトは 0.7;
fieldName {String} バックエンドによって受信されるフィールド名、デフォルト: file; 返される結果は、then()、catch()、および 3 つのメソッドを持つ Promise オブジェクトです。いつも。
then(rst): バックエンドによって処理できる
rst.formData データ; rst.file 圧縮ファイル オブジェクト (デフォルトではコピーが rst.formData に失われていることに注意してください)。圧縮率が低すぎる場合、これは元のファイル オブジェクトになります。
rst.fileLen 生成されたイメージのサイズ。バックエンドはこの値を使用して送信が完了したかどうかを確認できます。 rst.base64 生成されたイメージの Base64 、バックエンドはそれを処理できます。この文字列は画像であり、img.src =base64; にも直接使用されます。
rst.base64Len は、生成された Base64 のサイズです。バックエンドは、この値を使用して、送信が完了したかどうかを確認できます。 Base64 アップロード メソッドが使用されます);
最初の元のファイル オブジェクトには、サイズ、日付などの元のファイル情報が格納されます。
注: クリックして写真を撮り、写真をアップロードし続ける可能性があるため、アップロード コントロールの値は always コールバック関数でクリアする必要があります。
// 清空文件上传控件的值 e.target.value = null;2. クリックして最初の写真を撮り、プレビューと写真の撮影を続けるための DOM 表示を表示します
isPhoto
デフォルトの isPhoto は、写真を撮り続けるための DOM 表示を非表示にし、toggleAddPic は写真の長さを監視します現在選択されている imgUrls 配列、および isPhoto のブール値を変換します。 1 つ以上の写真があり、isPhoto を false に設定すると、最初の写真を撮影するための DOM が非表示になり、写真を撮影し続けるための DOM が存在する場合は表示されます。写真がない場合は、最初の写真を撮影するための DOM が非表示になり、最初の写真を撮影するための DOM が表示されます。3. 選択した圧縮画像を削除delImage
配列に対応する添え字に従い、imgUrls内の対応する画像データを削除します。delImage: function(index) { let vm = this; let btnArray = ['取消', '确定']; mui.confirm('确定删除该图片?','提示', btnArray, function(e) { if (e.index == 1) { vm.imgUrls.splice(index, 1); } }) }
4. 圧縮画像の大きな画像プレビューと大きな画像プレビューを閉じる
はプレビュープレビュー画像を閉じるプレビュー在这里大图预览就是将base64格式的图片直接放进预览DOM的img src中放大展示,点击图片自身关闭预览,清空img src资源。
5. 对base64图片传输前的处理 saveImage
saveImage: function(){ let vm = this; let urlArr = [], imgUrls = this.imgUrls; for(let i = 0; i < imgUrls.length; i++) { if(imgUrls[i].indexOf('file') == -1) { urlArr.push(imgUrls[i].split(',')[1]); } else { urlArr.push(imgUrls[i]); } } //数据传输操作 }
我压缩成base64字符串是“data:image/jpeg;base64,~~”的字符串,为了后端好处理,我这里为了将编辑时候后台返回的图片url区别开来,将“data:image/jpeg;base64,"截取掉,只传递给后端逗号后面的base64字符串。
注意:后端接收到我传递的base64字符串数组的时候,发现字符经如果被urlencode后标准的base64中的/、 +会被转成%xx,后端在将base64字符串处理成图片时,需要将特殊字符过滤掉。
public ActionResult MUploadImgBase64Str(string base64str) { try { var imgData = base64str; //过滤特殊字符即可 string dummyData = imgData.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+"); if (dummyData.Length % 4 > 0) { dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '='); } byte[] byteArray = Convert.FromBase64String(dummyData); using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray)) { var img = System.Drawing.Image.FromStream(ms); var path = "~/Content/UploadFiles/mobile/"; var uploadpath = Server.MapPath(path); if (!Directory.Exists(uploadpath)) { Directory.CreateDirectory(uploadpath); } var saveName = uploadpath + “stoneniqiu” + ".jpg"; img.Save(saveName); return Json(saveName); } } catch (Exception e) { return Json(e.Message); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
基于casperjs和resemble.js实现一个像素对比服务
以上がVue.js 2.0 モバイル側カメラ圧縮画像アップロードプレビュー機能の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

VueUse 是 Anthony Fu 的一个开源项目,它为 Vue 开发人员提供了大量适用于 Vue 2 和 Vue 3 的基本 Composition API 实用程序函数。本篇文章就来给大家分享几个我常用的几个 VueUse 最佳组合,希望对大家有所帮助!

Vue3如何更好地使用qrcodejs生成二维码并添加文字描述?下面本篇文章给大家介绍一下Vue3+qrcodejs生成二维码并添加文字描述,希望对大家有所帮助。

如何使用VueRouter4.x?下面本篇文章就来给大家分享快速上手教程,介绍一下10分钟快速上手VueRouter4.x的方法,希望对大家有所帮助!

本篇文章给大家整理分享8个GitHub上很棒的的 Vue 项目,都是非常棒的项目,希望当中有您想要收藏的那一个。

本篇文章带大家聊聊vue指令中的修饰符,对比一下vue中的指令修饰符和dom事件中的event对象,介绍一下常用的事件修饰符,希望对大家有所帮助!

如何覆盖组件库样式?下面本篇文章给大家介绍一下React和Vue项目中优雅地覆盖组件库样式的方法,希望对大家有所帮助!


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

WebStorm Mac版
便利なJavaScript開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ホットトピック



