Comment télécharger une image et la sauvegarder dans la base de données? [dupliquer]

cette question a déjà une réponse ici:

je dois créer un formulaire en utilisant JavaScript et un utilisateur va télécharger un fichier JPG et soumettre avec d'autres informations telles que le nom, email, etc. Lorsque l'utilisateur clique sur soumettre toutes les informations du formulaire seront chargés sur un objet de valeur. Pour le fichier image, j'ai mis byte[] .

en supposant:

public String name;
public String email;
public byte[] logo;

j'ai mis en place un servlet pour gérer la soumission mais je ne sais pas comment commencer. Comment fonctionne le téléchargement? Lorsque l'utilisateur soumet, comment puis-je obtenir les informations de l'image? Voici une capture d'écran: http://imageshack.us/f/32/77675354.png / je dois convertir cette image et le sauver à un byte[] puis convertir en blob de sorte que je peux l'insérer à une table.

8
demandé sur BalusC 2011-08-12 02:25:57

2 réponses

pour la partie de téléchargement de fichier, vous devez définir enctype="multipart/form-data" sur le formulaire HTML afin que le navigateur envoie le contenu du fichier et vous souhaitez utiliser request.getPart() dans la méthode doPost() de servlet pour obtenir le fichier comme un InputStream . Pour un exemple de code concret, voir aussi comment télécharger des fichiers vers le serveur en utilisant JSP / Servlet?

alors, pour enregistrer ce InputStream dans le DB, il suffit d'utiliser PreparedStatement#setBinaryStream() sur un BLOB / varbinary / bytea colonne ou n'importe quelle colonne représente "données binaires" dans votre moteur de base de données préféré.

preparedStatement = connection.prepareStatement("INSERT INTO user (name, email, logo) VALUES (?, ?, ?)");
preparedStatement.setString(1, name);
preparedStatement.setString(2, email);
preparedStatement.setBinaryStream(3, logo);
// ...

vous n'avez pas nécessairement besoin de convertir ce InputStream en byte[] , il n'aurait pas été efficace de mémoire non plus. Imaginez que 100 utilisateurs téléchargent simultanément des images de 10 Mo, puis 1 Go de mémoire du serveur aurait été alloué à ce point.

11
répondu BalusC 2017-05-23 12:10:25

Vous ne devriez probablement pas stocker une image dans une base de données. La base de données est littéralement l'endroit le plus cher où vous pouvez stocker des données binaires . La taille de la base de données va augmenter rapidement et le coût d'interrogation est élevé. Vous pourriez vous retrouver avec une solution d'hébergement d'image non évolutive et à peine efficace.

le stocke dans un serveur de ressources séparé, comme Amazon S3 ou n'importe où ailleurs (NGINX local, Tomcat etc).

à la place, vous pouvez stocker unique noms de fichier et/ou chemin complet vers le fichier. De cette façon, vous faciliterez la charge de travail de DB et les données de colonnes seront lisibles, de sorte que vous pouvez rapidement trouver l'image désirée. Je ne parle même pas de performance en général, un simple benchmark le prouvera facilement.

1
répondu Mikhail Kholodkov 2018-01-05 18:15:42