Die Komponente vue-cropper realisiert das Zuschneiden und Hochladen von Bildern

Die Komponente vue-cropper realisiert das Zuschneiden und Hochladen von Bildern

In diesem Artikel wird der spezifische Code der Vue-Cropper-Komponente zur Implementierung des Bildausschneidens und -hochladens zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

In den letzten paar Tagen hatte ich etwas Freizeit und habe das Hochladen von Avataren mit Vue und Spring Boot geübt. Ich habe es also aufgeschrieben und hoffe, dass es für die zukünftige Entwicklung hilfreich sein wird.

Einführung von Vue-Cropper in Vue

1. Einführung in die Komponente

importiere { VueCropper } von 'vue-cropper' 
Komponenten:
  VueCropper,
},

2. Globale Einführung

Konfigurieren Sie den folgenden Code in main.js

Importiere VueCropper von „vue-cropper“ 

Vue.use(VueCropper)

3. Anwendungsbeispiele

VUE-Datei

<Vorlage>
  <el-dialog
    Titel="Avatar bearbeiten"
    :visible.sync="dialogFormularSichtbar"
    :Schließen bei Klick-Modal="false"
    An den Hauptteil anhängen
  >
    <label class="btn" for="uploads">Wählen Sie ein Bild aus</label>
    <Eingabe
      Typ="Datei"
      id="Hochladen"
      :Wert="Bilddatei"
      Stil="Position:absolut; Clip:Rechteck(0 0 0 0);"
      akzeptieren="bild/png, bild/jpeg, bild/gif, bild/jpg"
      @change="uploadImg($event, 1)"
    >
    <div Stil="Margin-left:20px;">
      <div Klasse = "show-preview" :style = "{'overflow': 'hidden', 'margin': '5px'}">
        <div: style="Vorschau.div" Klasse="Vorschau" Stil="Breite: 40px;Höhe: 40px;">
          <img :src="vorschau.url" :style="vorschau.img">
        </div>
      </div>
    </div>
    <div Klasse="Schnitt">
      <vueCropper
        ref="Beschneider"
        :img="Option.img"
        :Ausgabegröße="Option.Größe"
        :Ausgabetyp="Option.Ausgabetyp"
        :info="wahr"
        :full="Option.full"
        :kannVerschieben="Option.kannVerschieben"
        :kannBox verschieben="Option.kannBox verschieben"
        :original="Option.original"
        :autoCrop="Option.autoCrop"
        :autoCropWidth="Option.autoCropWidth"
        :autoCropHeight="Option.autoCropHeight"
        :fixedBox="Option.fixedBox"
        @realTime="Echtzeit"
        @imgLoad="imgLoad"
      ></vueCropper>
    </div>
    <div slot="Fußzeile" class="dialog-footer">
      <el-button @click="dialogFormVisible = false" size="small">Abbrechen</el-button>
      <el-button Typ="primary" @click="finish('blob')" Größe="small">OK</el-button>
    </div>
  </el-dialog>
</Vorlage>

<Skript>
importiere { VueCropper } von "vue-cropper";
Standard exportieren {
  Komponenten:
    VueCropper
  },
  Daten() {
    zurückkehren {
      Vorschau: {},
      Modell: falsch,
      Modellquelle: "",
      Dateiname: "",
      imgDatei: "",
      dialogFormVisible: false,
      Option: {
        img: "",
        outputSize: 1, //Bildqualität nach dem Schneiden (0,1-1)
        full: false, // Ausgabe des Originalbildanteils Screenshot Requisitenname full
        Ausgabetyp: "png",
        kannVerschieben: wahr,
        Original: falsch,
        canMoveBox: wahr,
        autoCrop: wahr,
        autoCropWidth: 40,
        autoCropHeight: 40,
        fixedBox: wahr
      }
    };
  },
  Methoden: {
    //Bild hochladen (auf die Schaltfläche „Hochladen“ klicken)
    fertig(Typ) {
      lass selft = dies;
      let formData = neue FormData();
      // Ausgabewenn (Typ === "Blob") {
        selft.$refs.cropper.getCropBlob(data => {
          let img = window.URL.createObjectURL(Daten);
          selft.modell = wahr;
          selft.modelSrc = img;
          formData.append("Datei", Daten, selft.Dateiname);
          selft.$api.writer.userUpload(formData, r => {
            wenn (r.code) {
              selft.$alert.error(r.msg);
            } anders {
              selft.$message({
                Nachricht: r.data.msg,
                Typ: „Erfolg“
              });
              selft.$store.state.userInfo = r.data.data;
              selft.dialogFormVisible = false;
            }
          });
        });
      } anders {
        dies.$refs.cropper.getCropData(data => {});
      }
    },
    //Wähle ein lokales Bild aus uploadImg(e, num) {
      console.log("Bild hochladen");
      var selft = dies;
      //Bild hochladen var file = e.target.files[0];
      selft.fileName = Dateiname;
      wenn (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.ziel.wert)) {
        alert("Der Bildtyp muss einer der folgenden sein: .gif, jpeg, jpg, png, bmp");
        gibt false zurück;
      }
      var reader = neuer FileReader();
      reader.onload = e => {
        Daten lassen;
        wenn (Typ von e.Ziel.Ergebnis === "Objekt") {
          // Array-Puffer in Blob konvertieren. Wenn es Base64 ist, ist es nicht erforderlich. data = window.URL.createObjectURL(new Blob([e.target.result]));
        } anders {
          Daten = e.Ziel.Ergebnis;
        }
        wenn (Zahl === 1) {
          selft.option.img = Daten;
        } sonst wenn (Zahl === 2) {
          selft.example2.img = Daten;
        }
      };
      // In Base64 konvertieren
      // reader.readAsDataURL(Datei)
      // In Blob konvertieren
      Leser.readAsArrayBuffer(Datei);
    },
    zeigen() {
      this.dialogFormVisible = true;
    },
    // Echtzeitvorschaufunktion realTime(data) {
      console.log("Echtzeit");
      this.previews = Daten;
    },
    imgLoad(msg) {
      console.log("imgLoad");
      Konsole.log(Nachricht);
    }
  }
};
</Skript>

<style lang="less">
@import "./userLogo.less";
</Stil>

weniger Datei

.schneiden {
    Breite: 300px;
    Höhe: 300px;
    Rand: 0px automatisch;
}

.hh {
    .el-dialog__header {
        Polsterung: 0px;
        Zeilenhöhe: 2;
        Hintergrundfarbe: #f3f3f3;
        Höhe: 31px;
        Rahmen unten: 1px durchgezogen #e5e5e5;
        Hintergrund: #f3f3f3;
        Rahmen oben links – Radius: 5px;
        Rahmen oben rechts – Radius: 5px;
    }
    .el-dialog__title {
        schweben: links;
        Höhe: 31px;
        Farbe: #4c4c4c;
        Schriftgröße: 12px;
        Zeilenhöhe: 31px;
        Überlauf: versteckt;
        Rand: 0;
        Polsterung links: 10px;
        Schriftstärke: fett;
        Textschatten: 0 1px 1px #fff;
    }
    .el-dialog__headerbtn {
        Position: absolut;
        oben: 8px;
        rechts: 10px;
        Polsterung: 0;
        Hintergrund: 0 0;
        Rand: keiner;
        Umriss: 0;
        Cursor: Zeiger;
        Schriftgröße: 16px;
    }
}

.btn {
    Anzeige: Inline-Block;
    Zeilenhöhe: 1;
    Leerzeichen: Nowrap;
    Cursor: Zeiger;
    Hintergrund: #fff;
    Rand: 1px durchgezogen #c0ccda;
    Farbe: #1f2d3d;
    Textausrichtung: zentriert;
    Box-Größe: Rahmenbox;
    Gliederung: keine;
    //Rand: 20px 10px 0px 0px;
    Polsterung: 9px 15px;
    Schriftgröße: 14px;
    Rahmenradius: 4px;
    Farbe: #fff;
    Hintergrundfarbe: #50bfff;
    Rahmenfarbe: #50bfff;
    Übergang: alle 0,2 s mühelos;
    Textdekoration: keine;
    Benutzerauswahl: keine;
}

.show-preview {
    biegen: 1;
    -webkit-flex: 1;
    Anzeige: Flex;
    Anzeige: -webkit-flex;
    Inhalt ausrichten: zentriert;
    -webkit-justify-content: zentrieren;
    .Vorschau {
        Überlauf: versteckt;
        Randradius: 50 %;
        Rand: 1px durchgezogen #cccccc;
        Hintergrund: #cccccc;
    }
}

Konfigurieren Sie den Inhaltstyp von Axios beim Senden einer Anfrage

// HTTP-Anforderungs-Interceptor axios.interceptors.request.use(
  Konfiguration => {Debugger
    let token = sessionStorage.getItem('token')
    wenn (Token) {
      config.headers.Authorization = Token;
    }
    wenn (config && config.url && config.url.indexOf('upload') > 0) {
      config.headers['Inhaltstyp'] = 'multipart/Formulardaten'
    }
    Konfiguration zurückgeben
  },
  err => {
    returniere Promise.reject(err)
  }
)

Boot-Controller

@RequestMapping("/hochladen")
 öffentliche ResultData-Upload(@RequestParam("Datei") MultipartFile-Datei) {
  gibt userService.upload(Datei) zurück;
 }

Boot-Dienst

@Überschreiben
 öffentlicher ResultData-Upload (MultipartFile-Datei) {
  wenn (!file.isEmpty()) {
   
   StringBuffer requestURL = sessionUtil.getRequestURL();
   int end = requestURL.indexOf("/Benutzer/Upload");
   String Basispfad = requestURL.substring(0, Ende);
   String SavePath = Basispfad + "/static/img/logo/";
   // Dateinamen inklusive Suffix abrufen String fileName = file.getOriginalFilename();

   String saveDbPath = savePath + Dateiname;

   // Unter diesem Pfad gespeichert: Dieser Pfad ist die statische Datei im Projektverzeichnis: (Hinweis: Möglicherweise müssen Sie diese Datei selbst erstellen.)
   // Der Grund für die Platzierung unter „statisch“ besteht darin, dass es statische Dateiressourcen speichert, d. h. der Zugriff ist möglich, indem die lokale Serveradresse eingegeben und der Dateiname über den Browser hinzugefügt wird. String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "static/img/logo/";

   // Diese Methode ist ein Wrapper zum Schreiben von Dateien. Importieren Sie in der Util-Klasse das Paket, um es zu verwenden. Die Methode wird später angegeben. try {
    FileUtil.fileupload(file.getBytes(), Pfad, Dateiname);
    // Erstellen Sie dann die entsprechende Entitätsklasse, fügen Sie den folgenden Pfad hinzu und schreiben Sie dann „User“ über die Datenbankoperationsmethode „user = sessionUtil.getSessionUser();“.
    Benutzer.setLogo(saveDbPath);
    Benutzer, wobei Benutzer = neuer Benutzer();
    woUser.setId(user.getId());
    ConfigHelper.update(Benutzer, "Benutzer", wobeiBenutzer);
    Map<String, Objekt> map = neue HashMap<>();
    map.put("msg", "Avatar erfolgreich geändert");
    map.put("Daten", Benutzer);
    gibt ResultData.ok(map) zurück;
   } Fang (IOException e) {
    log.error("Bild hochladen ==》" + e.getMessage());
    e.printStackTrace();
    returniere ResultData.failed(e.getMessage());
   } Fang (Ausnahme e) {
    log.error("Letztes Bild ==》" + e.getMessage());
    e.printStackTrace();
    returniere ResultData.failed(e.getMessage());
   }

  } anders {
   return ResultData.failed("Bild hochladen fehlgeschlagen");
  }
 }

Beenden

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Springboot + Vue-Cropper realisiert den Effekt des Avatar-Ausschneidens und -Hochladens
  • Das Vue-Cropper-Plugin realisiert die Kapselung der Bildaufnahme- und Upload-Komponente
  • Detaillierte Erklärung zur Verwendung von vue-cropper, einem Vue-Plugin zum Zuschneiden von Bildern
  • Vue-Cropper Die Grundprinzipien und Ideen des Bildzuschneidens
  • Kapselung von Vue basierend auf cropper.js zur Realisierung der Online-Komponentenfunktion zum Zuschneiden von Bildern
  • Wissen Sie, wie Sie mit Vue-Cropper Bilder in Vue zuschneiden?

<<:  So führen Sie MySQL mit Docker-Compose aus

>>:  So installieren Sie MySQL und MariaDB in Docker

Artikel empfehlen

So erstellen Sie schnell einen FTP-Dateidienst mit FileZilla

Um die Speicherung und den Zugriff auf Dateien zu...

Eine kurze Analyse des MySQL-Index

Ein Datenbankindex ist eine Datenstruktur, deren ...

Details zur Verwendung regulärer Ausdrücke in MySQL

Inhaltsverzeichnis 1. Einleitung 2. Bereiten Sie ...

Suchmaschinenfreie Sammlung von Website-Einträgen

1: Anmeldeeingang der Baidu-Website Website: http:...

So implementieren Sie Polygonbrechung in Echtzeit mit Threejs

Inhaltsverzeichnis Vorwort Schritt 1: Aufbau und ...

So ändern Sie die Systemsprache von CentOS7 in vereinfachtes Chinesisch

veranschaulichen Bei einer Eigeninstallation des ...

So verwenden Sie wangEditor in Vue und erhalten durch Echo von Daten den Fokus

Bei der Hintergrundverwaltung von Projekten werde...

Attribute und Verwendung von INS- und DEL-Tags

ins und del wurden in HTML 4.0 eingeführt, um Auto...

MySQL verwendet Binlog-Protokolle zur Implementierung der Datenwiederherstellung

MySQL Binlog ist ein sehr wichtiges Protokoll in ...

Detaillierte Erläuterung des Quellcodes der vue.$set()-Methode von Vue

Bei der Verwendung von Vue zum Entwickeln von Pro...

Detaillierte Erklärung der Verwendung von JSON.parse und JSON.stringify

Inhaltsverzeichnis JSON.parse JSON.parse-Syntax R...

JavaScript-HTML zur Implementierung der mobilen Red Envelope Rain-Funktionsseite

In diesem Artikelbeispiel wird der spezifische HT...

Vue implementiert eine Zeit-Countdown-Funktion

In diesem Artikelbeispiel wird der spezifische Co...