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 verbessern Sie die Sicherheit von Linux- und Unix-Servern

Netzwerksicherheit ist ein sehr wichtiges Thema u...

Löschen Sie den Image-Vorgang von „none“ in Docker-Images

Da ich normalerweise den Befehl „Docker Build“ ve...

Docker löscht private Bibliotheksbilder vollständig

Werfen wir zunächst einen Blick auf die allgemein...

Linux-Befehl „cut“ erklärt

Der Cut-Befehl in Linux und Unix dient dazu, aus ...

Optimierungsanalyse der Limit-Abfrage in MySQL-Optimierungstechniken

Vorwort Im realen Geschäftsleben ist Paging eine ...

Die entsprechenden Attribute und Verwendung von XHTML-Tags in CSS

Als ich anfing, Webseiten mit XHTML CSS zu entwer...

Beherrschen Sie die häufig verwendeten HTML-Tags zum Zitieren von Inhalten auf Webseiten.

Verwenden Sie „blockquote“ für lange Zitate, „q“ ...

Vue implementiert mehrere Ideen zum Themenwechsel

Inhaltsverzeichnis Themen dynamisch ändern Die er...

Mehrere beliebte Website-Navigationsrichtungen in der Zukunft

<br />Dies ist nicht nur ein Zeitalter der I...

Implementierung der Docker-Bereitstellung von Django+Mysql+Redis+Gunicorn+Nginx

I. Einleitung Die Docker-Technologie erfreut sich...

Auszeichnungssprachen – Nochmal auflisten

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

MySQL fragt den aktuellsten Datensatz der SQL-Anweisung ab (Optimierung)

Die schlechteste Option besteht darin, die Ergebn...

Diskussion über die Möglichkeit zum Öffnen von Website-Hyperlinks

Ein neues Fenster wird geöffnet. Vorteile: Wenn d...