[JAVA] Comment gérer les images téléchargées

introduction

Où est le bon endroit pour stocker les images téléchargées par les utilisateurs lors de la création d'un service Web? ?? C'est un service qui nécessite un téléchargement comme Instagram ou pixiv, et même si ce n'est pas le cas, je pense que vous téléchargez souvent des photos pour votre profil.

Tobidemo Quand je l'ai fait, j'avais du mal à stocker les images téléchargées par l'utilisateur. Une fois que vous connaissez le chemin où l'image est enregistrée, vous pouvez suivre le chemin et voir d'autres images autant que vous le souhaitez! ?? D'une manière ou d'une autre, ça fait mal J'ai essayé de le découvrir, mais je n'avais pas d'article comme Best Practice, j'ai donc résumé comment enquêter et mettre en œuvre moi-même.

Enquête

J'ai vérifié la manière dont les services Web dans le monde traitent les images.

pixiv Il semble que les illustrations et les icônes soient gérées par les informations de date et d'heure + UUID. Si le nombre d'annuaires augmente chaque jour, il deviendra 1825 annuaires dans 5 ans, mais les performances de recherche ici sont Je me demande comment l'améliorer.

Une illustration:

https: // i.pximg.net/img-original/img/ ** Informations date et heure ** / 05/19 / ** Informations date et heure ** / 32/55 / 608090000_p0.jpg

icône:

https: //i.pximg.net/user-profile/img/** Informations de date et d'heure ** / 02/20 / ** Informations de date et d'heure ** / 52/02 / 8996319_4b86000332fa62d00000392d64a00000_170.jpg;

instagram Instagram semble gérer une combinaison d'UUID. Le chemin est long.

icône:

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

Photo:

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

Zoho Docs (stockage dans le cloud)

Les deux services ci-dessus peuvent télécharger des images en entrant l'URL dans le navigateur. Il n'a pas pu être affiché dans Zoho Docs. L'icône peut être affichée. Bien entendu, les images privées sont authentifiées lors de leur affichage.

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

icône: https:// accounts.zoho.com/file?fs=normal&nocache=10000805400000

Résultats du sondage

Les images téléchargées par les utilisateurs sont enregistrées à l'aide de l'UUID, de la date, etc. comme chemins. Pour les services censés être partagés, tels que les services de partage d'images, Il est difficile à prévoir car l'UUID etc. est utilisé pour le chemin. (Puisqu'il s'agit d'une information publique en premier lieu, il n'y a pas de problème même si c'est prévu)

Les services censés être gérés de manière privée effectuent une sorte d'authentification pour l'affichage des images.

C'était un résultat très naturel, mais j'ai découvert comment stocker des images en général.

Implémentation dans Tobi Demo

Sur la base de ces informations, considérez la fonction de téléchargement d'image et la partie d'affichage. Tobi Demo est un outil pour créer des démos de logiciels. Dans certains cas, vous pouvez télécharger une image qui peut être publiée à un tiers, et en BtoB, vous pouvez vouloir la partager uniquement avec une personne spécifique. Actuellement, toute personne connaissant l'URL peut accéder à la démo, mais à l'avenir, des restrictions d'accès seront imposées pour chaque démo. Je m'attendais également à le mettre. Par conséquent, j'ai supposé qu'il contenait des images qui ne pouvaient pas être rendues publiques.

Stockage d'images

Enregistrez l'image dans un emplacement qui n'est pas accessible de l'extérieur du serveur local avec un chemin comme celui ci-dessous. Si vous n'êtes pas enregistré, l'image sera enregistrée au format tmp et supprimée dans 30 jours. (La fonction de suppression n'est pas implémentée) Si vous êtes enregistré en tant qu'utilisateur, le répertoire est séparé à l'aide de l'ID utilisateur et de l'ID démo. L'image a été imitée pour générer et utiliser un UUID à 6 chiffres.

tmp/UUID.png ID utilisateur / ID démo / UUID.png

Il était inconfortable de stocker des images NG publiques dans un répertoire qui peut être publié en externe, donc En premier lieu, j'ai décidé d'utiliser une méthode de stockage inaccessible même si je connais le chemin.

Affichage de l'image

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

Au lieu de renvoyer l'URL lorsqu'il y a une demande d'image En convertissant l'image en une colonne Byte et en la faisant lire par le navigateur telle quelle Les données d'image peuvent désormais être affichées sans passer d'URL.

Vous n'avez pas à penser à accéder à l'image avec cela, donc si nécessaire, Il semble que la fonction de contrôle d'accès puisse être mise en œuvre en définissant l'authentification à effectuer lorsque le lien de démonstration est appelé.

Eh bien, honnêtement, je me demande si c'était correct. Cela aurait peut-être été correct de ne mettre que les images (démo) qui doivent être authentifiées dans un répertoire séparé et de s'y authentifier. Je me demande s'il n'y a pas de problème avec la charge lors du passage de la colonne Byte directement au navigateur, j'ai l'impression que ce n'était pas le meilleur. (Même si vous passez le lien, il téléchargera et lira les données de toute façon, donc cela ne devrait pas changer?) Existe-t-il un livre qui résume les connaissances sur le traitement d'image des services Web? ..

Voici l'implémentation de la conversion en une colonne Byte et de sa transmission lors de l'affichage d'une image.

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) {
						//Bloc de capture généré automatiquement TODO
						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));
				}

Résumé

Je pensais que les images étaient stockées localement, alors quand j'ai choisi VPS, j'ai choisi un serveur avec beaucoup de disque dur. Les images de chacun sont stockées dans S3. Je suis content d'avoir dû le stocker localement cette fois, mais maintenant stockons l'image dans S3.

Recommended Posts

Comment gérer les images téléchargées
[rails] Comment publier des images
Comment réduire les images Java
Comment gérer les instances
Gérer les fichiers CSV téléchargés sur GCS
[Rails] Comment télécharger des images à l'aide de Carrierwave
[java] Résumé de la gestion des caractères
Comment changer d'images miniatures avec JavaScript
Comment gérer les erreurs de connexion avec l'appareil
[java] Résumé de la gestion des chaînes de caractères
Comment enregistrer des images sur Heroku dans S3 sur AWS
[Rails] Comment télécharger plusieurs images à l'aide de Carrierwave
Comment gérer facultatif dans les tampons de protocole (proto3)
Comment lier des images à l'aide de FactoryBot Active Storage
Comment développer OpenSPIFe
Comment utiliser Map
Comment écrire des rails
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment installer Docker
Comment utiliser MapStruct
Comment utiliser TreeSet
Comment désinstaller Rails
Comment installer docker-machine
[Comment utiliser l'étiquette]
Comment faire un pot ombré
Comment écrire docker-compose
Comment utiliser l'identité
Comment utiliser le hachage
Comment écrire Mockito
Comment créer docker-compose
Comment installer MySQL
Comment écrire un fichier de migration
Comment construire android-midi-lib
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment repousser la barre oblique \
Comment concaténer des chaînes
Comment supprimer des images non balisées en masse avec Docker
Comment gérer les fichiers TSV et les fichiers CSV dans Ruby
Comment télécharger des images depuis AWS S3 (rails, carrierwave)