Java tutorial
/**************************************************************************** ASCMII is a web application developped for the Ecole Centrale de Nantes aiming to organize quizzes during courses or lectures. Copyright (C) 2013 Malik Olivier Boussejra This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. ******************************************************************************/ package controllers; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import models.Image; import models.Reponse; import play.mvc.Controller; import play.mvc.Http.MultipartFormData; import play.mvc.Http.MultipartFormData.FilePart; import play.mvc.Result; /** * Toutes les fonctions concernant les images qui sont uploades pour chaque * rponse. * @author Admin * */ public class UploadImages extends Controller { /** * Permet d'uploader une image. L'image est enregistre dans le dossier "/img/". * On stocke le nom du fichier de l'image dans la base de donne et on le lie une rponse. * @param reponse_id * @return Affiche la page de gestion d'une sance */ public static Result upload(Long reponse_id) { Reponse reponse = Reponse.find.ref(reponse_id); MultipartFormData body = request().body().asMultipartFormData(); if (upload(body.getFile("image"), reponse)) { return SeancesListe.gererSeanceLog(reponse.question.serie.seance.id, "Image uploade avec succs !"); } else { return SeancesListe.gererSeanceLog(reponse.question.serie.seance.id, "Le fichier upload n'est pas image ou son format n'est pas support !"); } } /** * Upload une image sur le serveur * @param filePart : l'image uploader * @param reponse : une rponse laquelle appartient l'image qu'on uploade * @return VRAI si cela s'est droul avec succs, FAUX sinon */ static boolean upload(FilePart filePart, Reponse reponse) { if (isImage(filePart)) { File image = filePart.getFile(); String fileName = filePart.getFilename(); Image i = new Image(fileName); File destinationFile = new File( play.Play.application().path().getAbsolutePath() + "/img/" + i.fileName); System.out.println(play.Play.application().path().getAbsolutePath()); System.out.println(image.getAbsolutePath()); try { FileUtils.copyFile(image, destinationFile); i.addImage(reponse); System.out.println("Image uploade avec succs !"); return true; } catch (IOException e) { e.printStackTrace(); System.out.println("Impossible de copier l'image sur le serveur..."); return false; } } else { System.out.println("Le fichier upload n'est pas image ou son format n'est pas support !"); return false; } } /** * Vrifie que le fichier est bien une image * @param filePart : le fichier que l'on teste * @return VRAI ou FAUX */ static boolean isImage(FilePart filePart) { if (filePart != null) { return filePart.getContentType().startsWith("image"); } else { return false; } } /** * Supprime une image du serveur, mais aussi sa rfrence dans la base de donne. * Question ? : Doit-on supprimer l'image de la base de donne si elle n'est plus utilise ? * Imaginons qu'un prof exporte une srie et la donne un collgue. Si ce prof supprime * l'image avant que son collgue n'ait import la srie, alors il n'y aura pas d'image * affiche pour son collgue. * Cependant, pour l'instant, une image n'est pas supprime (ni de la base de donne, ni du * disque dur du serveur) tant qu'elle est utilise par au moins une rponse. * Notez qu'on met "null" dans la colonne "image_id" de la table "Reponse" avant de supprimer * l'image. * @param reponse_id * @return Affiche la page de gestion d'une sance */ public static Result deleteImage(Long reponse_id) { Reponse reponse = Reponse.find.ref(reponse_id); Image imgTemp = reponse.image; reponse.image = null; reponse.save(); Image.removeImage(imgTemp.id); return SeancesListe.gererSeanceLog(reponse.question.serie.seance.id, "L'image a t supprime avec succs."); } /** * Pour accder aux images uploades * @param filename * @return l'image */ public static Result view(String filename) { File file = new File(play.Play.application().path().getAbsolutePath() + "/img/" + filename); return ok(file); } /** * On uploade simplement une image sur le serveur. * Elle est enregistre dans le dossier /img/ * @return */ public static Result uploadOnly() { MultipartFormData body = request().body().asMultipartFormData(); FilePart fp = body.getFile("questionImages"); if (isImage(fp)) { Image i = new Image(fp.getFilename()); File image = fp.getFile(); File destinationFile = new File( play.Play.application().path().getAbsolutePath() + "/img/" + i.fileName); try { FileUtils.copyFile(image, destinationFile); i.save(); return ok("<img class=\"image\" src=\"/images/" + i.fileName + "\">"); } catch (IOException e) { e.printStackTrace(); System.out.println("Impossible de copier l'image sur le serveur..."); return internalServerError("Impossible de copier l'image sur le serveur..."); } } else return badRequest("Le fichier que vous avez slectionn n'est pas reconnu comme une image."); } }