[JAVA] Umgang mit hochgeladenen Bildern

Einführung

Wo ist der richtige Ort, um die von Benutzern beim Erstellen eines Webdienstes hochgeladenen Bilder zu speichern? ?? Es ist ein Dienst, der das Hochladen wie Instagram oder Pixiv erfordert, und selbst wenn dies nicht der Fall ist, denke ich, dass Sie häufig Fotos für Ihr Profil hochladen.

Tobidemo Als ich es geschafft habe, hatte ich Probleme beim Speichern der vom Benutzer hochgeladenen Bilder. Sobald Sie den Pfad kennen, in dem das Bild gespeichert ist, können Sie dem Pfad folgen und andere Bilder so oft sehen, wie Sie möchten! ?? Irgendwie fühlt es sich schlecht an. Ich habe versucht, es herauszufinden, aber ich hatte keinen Artikel wie Best Practice, daher habe ich zusammengefasst, wie ich ihn selbst untersuchen und implementieren kann.

Umfrage

Ich habe überprüft, wie die Webdienste in der Welt Bilder verarbeiten.

pixiv Es scheint, dass sowohl Abbildungen als auch Symbole nach Datums- und Uhrzeitinformationen + UUID verwaltet werden. Wenn die Anzahl der Verzeichnisse jeden Tag zunimmt, werden es in 5 Jahren 1825 Verzeichnisse, aber die Suchleistung hier ist gleich Ich frage mich, wie ich es verbessern kann.

Eine Illustration:

https: // i.pximg.net/img-original/img/ ** Datums- und Uhrzeitinformationen ** / 05/19 / ** Datums- und Uhrzeitinformationen ** / 32/55 / 608090000_p0.jpg

Symbol:

https: //i.pximg.net/user-profile/img/** Datums- und Uhrzeitinformationen ** / 02/20 / ** Datums- und Uhrzeitinformationen ** / 52/02 / 8996319_4b86000332fa62d00000392d64a00000_170.jpg;

instagram Instagram scheint eine Kombination von UUIDs zu verwalten. Der Weg ist lang.

Symbol:

https: //scontent-nrt1-1.cdninstagram.com/vp/26223423_148400000808676_7148163548756000000/5BC4422C/t51.2885-19/s150x150/26223423_148400000808676_7148163548756000000_n.jpg

Foto:

https:// scontent-nrt1-1.cdninstagram.com/vp/26223423_148400000808676_7148163548756000000/t51.2885-15/s640x640/sh0.08/e35/31232925_800900000769909_8151073854442100000_n.jpg

Zoho Docs (Cloud-Speicher)

Die beiden oben genannten Dienste können Bilder herunterladen, indem Sie die URL im Browser eingeben. Es konnte nicht in Zoho Docs angezeigt werden. Das Symbol kann angezeigt werden. Natürlich werden private Bilder authentifiziert, wenn sie angezeigt werden.

Foto: https:// download.zoho.com/docs/prv/00000c661d00000f644738ec6a58018300000?_t=1526805269750

Symbol: https:// accounts.zoho.com/file?fs=normal&nocache=10000805400000

Umfrageergebnisse

Von Benutzern hochgeladene Bilder werden unter Verwendung von UUID, Datum usw. als Pfade gespeichert. Für Dienste, die gemeinsam genutzt werden sollen, z. B. Image-Sharing-Dienste, Es ist schwer vorherzusagen, da UUID usw. für den Pfad verwendet werden. (Da es sich in erster Linie um öffentliche Informationen handelt, gibt es kein Problem, auch wenn dies vorhergesagt wird.)

Dienste, die privat verwaltet werden sollen, führen eine Art Authentifizierung für die Bildanzeige durch.

Es war ein sehr natürliches Ergebnis, aber ich fand heraus, wie man Bilder im Allgemeinen speichert.

Implementierung in der Tobi Demo

Berücksichtigen Sie anhand dieser Informationen die Funktion zum Hochladen von Bildern und den Anzeigeteil. Tobi Demo ist ein Tool zum Erstellen von Software-Demos. In einigen Fällen können Sie ein Bild hochladen, das für Dritte veröffentlicht werden kann, und in BtoB möchten Sie es möglicherweise nur für eine bestimmte Person freigeben. Derzeit kann jeder, der die URL kennt, auf die Demo zugreifen. In Zukunft werden jedoch für jede Demo Zugriffsbeschränkungen auferlegt. Ich hatte auch damit gerechnet, es anzuziehen. Daher habe ich angenommen, dass es Bilder enthält, die nicht für die Öffentlichkeit freigegeben werden können.

Bildspeicherung

Speichern Sie das Bild an einem Ort, auf den von außerhalb des lokalen Servers nicht zugegriffen werden kann, mit einem Pfad wie dem folgenden. Wenn Sie sich nicht registriert haben, wird das Bild in tmp gespeichert und innerhalb von 30 Tagen gelöscht. (Löschfunktion ist nicht implementiert) Wenn Sie als Benutzer registriert sind, wird das Verzeichnis anhand der Benutzer-ID und der Demo-ID getrennt. Das Bild wurde nachgeahmt, um eine 6-stellige UUID zu erzeugen und zu verwenden.

tmp/UUID.png Benutzer-ID / Demo-ID / UUID.png

Es war unangenehm, öffentliche NG-Bilder in einem Verzeichnis zu speichern, das extern veröffentlicht werden kann Zunächst habe ich mich für eine Speichermethode entschieden, auf die auch dann nicht zugegriffen werden kann, wenn ich den Pfad kenne.

Bildschirm

スクリーンショット 2018-05-20 18.36.46.png

Anstatt die URL zurückzugeben, wenn eine Bildanforderung vorliegt Indem Sie das Bild in eine Byte-Spalte konvertieren und vom Browser so lesen lassen, wie es ist Bilddaten können jetzt ohne Übergabe einer URL angezeigt werden.

Sie müssen nicht darüber nachdenken, auf das Bild zuzugreifen. Es scheint, dass die Zugriffssteuerungsfunktion implementiert werden kann, indem die Authentifizierung festgelegt wird, die ausgeführt werden soll, wenn der Demolink aufgerufen wird.

Ehrlich gesagt frage ich mich, ob das richtig war. Es könnte sinnvoll gewesen sein, nur die Bilder (Demo), die authentifiziert werden müssen, in einem separaten Verzeichnis abzulegen und dort zu authentifizieren. Ich frage mich, ob es kein Problem mit dem Laden gibt, wenn die Byte-Spalte direkt an den Browser übergeben wird. Ich denke, dass es nicht das Beste war. (Selbst wenn Sie den Link übergeben, werden die Daten trotzdem heruntergeladen und gelesen, sodass sie sich nicht ändern sollten.) Gibt es ein Buch, das das Wissen über die Bildverarbeitung von Webdiensten zusammenfasst? ..

Im Folgenden wird die Konvertierung in eine Byte-Spalte und deren Übergabe beim Anzeigen eines Bildes implementiert.

AddImgToDropZoneList.java




					fileStream = new FileInputStream(user_folder + "/" + dropzoneList.get(i).getImg() + ".png ");

					ByteArrayOutputStream os = new ByteArrayOutputStream();
					byte[] indata = new byte[10240 * 16];
					int siz;

					try {
						while ((siz = fileStream.read(indata, 0, indata.length)) > 0) {
							os.write(indata, 0, siz);
						}
					} catch (Exception e) {
						//TODO automatisch generierter Fangblock
						e.printStackTrace();
						System.out.print("failed to read byte stream");
						fileStream.close();

					}

					String base64 = new String(Base64.encodeBase64(os.toByteArray()), "ASCII");

					// System.out.print(base64);

					data = new StringBuffer();
					data.append("data:image/png;base64,");
					data.append(base64);
					fileStream.close();

					dropzoneWithImglist.add(new DropZoneWithImgBean(dropzoneList.get(i).getId(),
							dropzoneList.get(i).getLinkid(), dropzoneList.get(i).getDropzone(),
							dropzoneList.get(i).getImg(), data.toString(), width, height));
				} else {
					dropzoneWithImglist.add(new DropZoneWithImgBean(dropzoneList.get(i).getId(),
							dropzoneList.get(i).getLinkid(), dropzoneList.get(i).getDropzone(),
							dropzoneList.get(i).getImg(), "./../../img/default-none.png ", 1300, 1000));
				}

Zusammenfassung

Ich dachte, dass die Bilder lokal gespeichert wurden. Als ich mich für VPS entschied, entschied ich mich für einen Server mit viel Festplatte. Alle Bilder werden in S3 gespeichert. Ich bin froh, dass ich es dieses Mal lokal speichern musste, aber jetzt speichern wir das Bild in S3.

Recommended Posts

Umgang mit hochgeladenen Bildern
[Schienen] Wie poste ich Bilder?
So minimieren Sie Java-Images
Umgang mit Instanzen
Behandeln Sie in GCS hochgeladene CSV-Dateien
[Rails] So laden Sie Bilder mit Carrierwave hoch
[java] Zusammenfassung des Umgangs mit char
So wechseln Sie Miniaturbilder mit JavaScript
So behandeln Sie Anmeldefehler mit devise
[java] Zusammenfassung des Umgangs mit Zeichenketten
So speichern Sie Bilder auf Heroku in S3 unter AWS
[Rails] So laden Sie mehrere Bilder mit Carrierwave hoch
Vorgehensweise optional in Protokollpuffern (proto3)
So verknüpfen Sie Bilder mit FactoryBot Active Storage
So entwickeln Sie OpenSPIFe
Verwendung von Map
Wie schreibe ich Rails
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
So installieren Sie Docker
Verwendung von MapStruct
Verwendung von TreeSet
So deinstallieren Sie Rails
So installieren Sie Docker-Maschine
[Verwendung des Etiketts]
Wie man ein schattiertes Glas macht
Wie schreibe ich Docker-Compose
Wie man Identität benutzt
Wie man Hash benutzt
Wie schreibe ich Mockito
So erstellen Sie Docker-Compose
So installieren Sie MySQL
So schreiben Sie eine Migrationsdatei
Wie man android-midi-lib baut
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Wie man einen Schrägstrich zurückschlägt \
So verketten Sie Zeichenfolgen
So löschen Sie mit Docker Bilder ohne Tags in großen Mengen
Umgang mit TSV-Dateien und CSV-Dateien in Ruby
So laden Sie Bilder von AWS S3 herunter (Rails, Carrierwave)