vue-cropper コンポーネントは画像の切り取りとアップロードを実現します

vue-cropper コンポーネントは画像の切り取りとアップロードを実現します

この記事では、画像の切り取りとアップロードを実装するためのvue-cropperコンポーネントの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

ここ数日、少し時間ができたので、vue と spring boot を使用してアバターをアップロードする練習をしました。それを書き留めておき、今後の開発に役立つことを願っています。

vue での vue-cropper の導入

1. コンポーネントの紹介

'vue-cropper' から { VueCropper } をインポートします 
コンポーネント:
  ヴュークロッパー、
},

2. グローバル導入

main.jsで次のコードを設定します

'vue-cropper' から VueCropper をインポートします 

Vue.use(VueCropper)

3. 使用例

vueファイル

<テンプレート>
  <el-ダイアログ
    title="アバターを編集"
    :visible.sync="ダイアログフォームを表示"
    :クリック時に閉じるモーダル="false"
    本文に追加
  >
    <label class="btn" for="uploads">画像を選択</label>
    <入力
      タイプ="ファイル"
      id="アップロード"
      :value="画像ファイル"
      スタイル="position:absolute; clip:rect(0 0 0 0);"
      accept="image/png、image/jpeg、image/gif、image/jpg"
      @change="uploadImg($event, 1)"
    >
    <div style="margin-left:20px;">
      <div class="show-preview" :style="{'オーバーフロー': 'hidden', 'マージン': '5px'}">
        <div :style="previews.div" class="preview" style="幅: 40px;高さ: 40px;">
          <img :src="previews.url" :style="previews.img">
        </div>
      </div>
    </div>
    <div class="cut">
      <vueクロッパー
        ref="クロッパー"
        :img="オプション.img"
        :outputSize="オプションのサイズ"
        :outputType="オプション.outputType"
        :info="true"
        :full="オプション.full"
        :canMove="オプション.canMove"
        :canMoveBox="オプション.canMoveBox"
        :original="オプション.original"
        :autoCrop="オプション.autoCrop"
        :autoCropWidth="option.autoCropWidth"
        :autoCropHeight="option.autoCropHeight"
        :fixedBox="オプション.fixedBox"
        @realTime="実時間"
        @imgLoad="画像読み込み"
      </vueクロッパー>
    </div>
    <div スロット="フッター" クラス="ダイアログ フッター">
      <el-button @click="dialogFormVisible = false" size="small">キャンセル</el-button>
      <el-button type="primary" @click="finish('blob')" size="small">OK</el-button>
    </div>
  </el-ダイアログ>
</テンプレート>

<スクリプト>
「vue-cropper」から VueCropper をインポートします。
エクスポートデフォルト{
  コンポーネント:
    ビュークロッパー
  },
  データ() {
    戻る {
      プレビュー: {},
      モデル: false、
      モデルソース: "",
      ファイル名: ""、
      画像ファイル: "",
      ダイアログフォーム表示: false、
      オプション: {
        画像: "",
        outputSize: 1, //カット後の画像品質(0.1-1)
        full: false, // 元の画像の比率を出力します スクリーンショット props name full
        出力タイプ: "png",
        移動可能: true、
        オリジナル: 偽、
        canMoveBox: true、
        自動トリミング: true、
        自動クロップ幅: 40,
        自動クロップ高さ: 40,
        固定ボックス: true
      }
    };
  },
  メソッド: {
    //写真をアップロードします(アップロードボタンをクリック)
    終了(タイプ) {
      selft = this とします。
      formData を新しい FormData() にします。
      // 出力if (type === "blob") {
        selft.$refs.cropper.getCropBlob(データ => {
          img = window.URL.createObjectURL(data); とします。
          自己モデル = true;
          モデルを画像化します。
          formData.append("ファイル", データ, selft.fileName);
          selft.$api.writer.userUpload(formData, r => {
            (r.code)の場合{
              selft.$alert.error(r.msg);
            } それ以外 {
              自己t.$メッセージ({
                メッセージ: r.data.msg、
                タイプ: 「成功」
              });
              selft.$store.state.userInfo = r.data.data;
              selft.dialogFormVisible = false;
            }
          });
        });
      } それ以外 {
        this.$refs.cropper.getCropData(データ => {});
      }
    },
    //ローカル画像を選択 uploadImg(e, num) {
      console.log("アップロード画像");
      var selft = this;
      //写真をアップロード var file = e.target.files[0];
      selft.fileName = ファイル名;
      if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {
        alert("画像タイプは .gif、jpeg、jpg、png、bmp のいずれかである必要があります");
        false を返します。
      }
      var リーダー = 新しい FileReader();
      リーダー.onload = e => {
        データを入力します。
        if (typeof e.target.result === "オブジェクト") {
          // 配列バッファを BLOB に変換します。base64 の場合は必要ありません。data = window.URL.createObjectURL(new Blob([e.target.result]));
        } それ以外 {
          データ = e.target.result;
        }
        数値 === 1 の場合
          selft.option.img = データ;
        } そうでなければ (num === 2) {
          selft.example2.img = データ;
        }
      };
      // base64 に変換する
      // reader.readAsDataURL(ファイル)
      // ブロブに変換
      reader.readAsArrayBuffer(ファイル);
    },
    見せる() {
      this.dialogFormVisible = true;
    },
    // リアルタイムプレビュー関数 realTime(data) {
      console.log("リアルタイム");
      this.previews = データ;
    },
    画像読み込み(メッセージ) {
      コンソールにログ出力します。
      コンソールログ(メッセージ);
    }
  }
};
</スクリプト>

<スタイル lang="less">
@import "./userLogo.less";
</スタイル>

少ないファイル

。カット {
    幅: 300ピクセル;
    高さ: 300px;
    マージン: 0px 自動;
}

.hh {
    .el-ダイアログ__ヘッダー{
        パディング: 0px;
        行の高さ: 2;
        背景色: #f3f3f3;
        高さ: 31px;
        下境界線: 1px 実線 #e5e5e5;
        背景: #f3f3f3;
        左上の境界線の半径: 5px;
        右上の境界線の半径: 5px;
    }
    .el-ダイアログ__タイトル{
        フロート: 左;
        高さ: 31px;
        色: #4c4c4c;
        フォントサイズ: 12px;
        行の高さ: 31px;
        オーバーフロー: 非表示;
        マージン: 0;
        左パディング: 10px;
        フォントの太さ: 太字;
        テキストシャドウ: 0 1px 1px #fff;
    }
    .el-dialog__headerbtn {
        位置: 絶対;
        上: 8px;
        右: 10px;
        パディング: 0;
        背景: 0 0;
        境界線: なし;
        アウトライン: 0;
        カーソル: ポインタ;
        フォントサイズ: 16px;
    }
}

.btn{
    表示: インラインブロック;
    行の高さ: 1;
    空白: ラップなし;
    カーソル: ポインタ;
    背景: #fff;
    境界線: 1px 実線 #c0ccda;
    色: #1f2d3d;
    テキスト配置: 中央;
    ボックスのサイズ: 境界線ボックス;
    アウトライン: なし;
    //マージン: 20px 10px 0px 0px;
    パディング: 9px 15px;
    フォントサイズ: 14px;
    境界線の半径: 4px;
    色: #fff;
    背景色: #50bfff;
    境界線の色: #50bfff;
    遷移: すべて 0.2 秒の緩和;
    テキスト装飾: なし;
    ユーザー選択: なし;
}

.表示プレビュー{
    フレックス: 1;
    -webkit-flex: 1;
    ディスプレイ: フレックス;
    ディスプレイ: -webkit-flex;
    コンテンツの中央揃え: 中央;
    中央揃え
    .プレビュー{
        オーバーフロー: 非表示;
        境界線の半径: 50%;
        境界線: 1px 実線 #cccccc;
        背景: #cccccc;
    }
}

リクエストを送信するときにaxiosのContent-Typeを設定する

// http リクエストインターセプター axios.interceptors.request.use(
  config => {デバッガー
    token = sessionStorage.getItem('token') とします。
    if (トークン) {
      config.headers.Authorization = トークン;
    }
    config.url が 'upload' より 0 より大きい場合、
      config.headers['Content-Type'] = 'multipart/form-data'
    }
    設定を返す
  },
  エラー => {
    Promise.reject(err) を返します。
  }
)

ブートコントローラ

@RequestMapping("/アップロード")
 パブリックResultDataアップロード(@RequestParam("file")マルチパートファイルファイル) {
  userService.upload(ファイル) を返します。
 }

ブートサービス

@オーバーライド
 パブリックResultDataアップロード(MultipartFileファイル) {
  ファイルが空の場合(!file.isEmpty()){
   
   StringBuffer リクエスト URL = sessionUtil.getRequestURL();
   int end = requestURL.indexOf("/user/upload");
   文字列 basePath = requestURL.substring(0, end);
   文字列 savePath = basePath + "/static/img/logo/";
   // サフィックスを含むファイル名を取得します。String fileName = file.getOriginalFilename();

   文字列 saveDbPath = savePath + fileName;

   // このパスに保存されます: このパスはプロジェクト ディレクトリ内の静的ファイルです: (注: このファイルは自分で作成する必要がある場合があります)
   // これを static の下に置く理由は、静的ファイル リソースを保存するためです。つまり、ローカル サーバーのアドレスを入力し、ブラウザーからファイル名を追加することでアクセスできます。String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "static/img/logo/";

   // このメソッドはファイルを書き込むためのラッパーです。util クラスでは、パッケージをインポートして使用します。メソッドは後で説明します。try {
    FileUtil.fileupload(file.getBytes(), パス, ファイル名);
    // 次に、対応するエンティティ クラスを作成し、次のパスを追加して、データベース操作メソッドを通じて User を書き込みます。user = sessionUtil.getSessionUser();
    ユーザー.setLogo(DbPath を保存);
    ユーザー whereUser = new User();
    ここでUser.setId(user.getId());
    ConfigHelper.update(user, "user", whereUser);
    Map<String, Object> map = new HashMap<>();
    map.put("msg", "アバターが正常に変更されました");
    map.put("データ", ユーザー);
    ResultData.ok(map) を返します。
   } キャッチ (IOException e) {
    log.error("画像アップロード ==》" + e.getMessage());
    e.printStackTrace();
    ResultData.failed(e.getMessage()); を返します。
   } キャッチ (例外 e) {
    log.error("最後の画像 ==》" + e.getMessage());
    e.printStackTrace();
    ResultData.failed(e.getMessage()); を返します。
   }

  } それ以外 {
   ResultData.failed("画像のアップロードに失敗しました"); を返します。
  }
 }

仕上げる

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現
  • vue-cropperプラグインは、画像キャプチャとアップロードコンポーネントのカプセル化を実現します。
  • Vue画像切り抜きプラグインvue-cropperの使い方を詳しく説明します
  • Vue-cropper 画像切り抜きの基本原理とアイデア
  • Vue を cropper.js ベースでカプセル化し、オンライン画像切り抜きコンポーネント機能を実現する
  • vue-cropper を使用して vue で写真をトリミングする方法をご存知ですか?

<<:  MySQLでデータベースデータ保存ディレクトリを変更する方法

>>:  Docker に MySQL と MariaDB をインストールする方法

推薦する

ウェブデザイナーは適した人材

<br />この世に道はない。より多くの人が歩くようになると、それは道になります。最初は...

Tomcatはスレッドプールを使用してリモート同時リクエストを処理します。

Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...

IDEA を使用して Tomcat を設定し、JSP ファイルを作成する方法

idea を使用して JSP ファイルを書き込む前に、jdk 環境 (ここでは説明しません) と対応...

純粋な CSS3 でペットの鶏のサンプルコードを実現

最近、CSS3に関する知識や記事をたくさん読んできましたが、CSS3はとても便利に使えると思います。...

JavaScript によるダイナミッククリスマスツリーの詳細な説明

目次1. CSS のみを使用して作成したアニメーションのクリスマスツリー2. CSS のみを使用して...

Web ページでフラッシュの wmode 属性を使用する方法をご存知ですか?

Web 開発を行う際に、フラッシュがページ内の要素をブロックする状況に遭遇することがあります。フラ...

UbuntuでOpenCVをコンパイルしてインストールする方法

opencv2 の簡単なインストール: conda インストール --channel https:/...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows)

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカ...

MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

MySQL で中国語を入力すると、次のエラーが発生します。エラー 1366: 1366: 行 1 の...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

HTML チュートリアル: 順序なしリスト

<br />原文: http://andymao.com/andy/post/102.h...

動的画像読み込み技術の応用とjquery.lazyloadプラグインの使用例

アプリケーション例ウェブサイト http://www.uhuigou.net画像の動的読み込みは目新...

Xshell にショートカット コマンドを追加する方法

便利なターミナル エミュレーターである Xshell は、開発者がホスト サーバーをリモート管理する...

HTML/CSS におけるフロートの使用例の詳細

1. floatの基本的な使用例1. まず 2 つの div ボックスを作成し、高さ、幅、背景色を設...

MySQL でローカル ユーザーを作成し、データベース権限を付与する方法の例

序文MySQL をインストールすると、通常はスーパーユーザー root を作成します。多くの人がこの...