it.lufraproini.cms.servlet.upload_user_img.java Source code

Java tutorial

Introduction

Here is the source code for it.lufraproini.cms.servlet.upload_user_img.java

Source

/*   SimpleCMS - un semplice content management system di pagine statiche
 *    Copyright (C) 2013  Francesco Proietti, Luca Traini
 *
 *    This program is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Affero 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 Affero General Public License for more details.
 *
 *    You should have received a copy of the GNU Affero General Public License
 *    along with this program.  If not, see <http://www.gnu.org/licenses/>
 */
package it.lufraproini.cms.servlet;

import it.lufraproini.cms.framework.result.FailureResult;
import it.lufraproini.cms.model.Immagine;
import it.lufraproini.cms.model.Utente;
import it.lufraproini.cms.model.impl.CMSDataLayerImpl;
import it.lufraproini.cms.utility.ErroreGrave;
import it.lufraproini.cms.utility.SecurityLayer;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

/**
 *
 * @author fsfskittu
 */
public class upload_user_img extends HttpServlet {

    //funzione che prende il campo file dalla form e crea una Map con tutte le informazioni sul file
    //necessarie per effettuare correttamente tutte le operazioni di upload
    private Map prendiInfoFile(HttpServletRequest request) throws ErroreGrave, IOException {
        Map infofile = new HashMap();
        //riutilizzo codice prof. Della Penna per l'upload
        if (ServletFileUpload.isMultipartContent(request)) {
            // Funzioni delle librerie Apache per l'upload
            try {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List<FileItem> items;
                FileItem file = null;

                items = upload.parseRequest(request);
                for (FileItem item : items) {
                    String name = item.getFieldName();
                    if (name.equals("file_to_upload")) {
                        file = item;
                        break;
                    }
                }
                if (file == null || file.getName().equals("")) {
                    throw new ErroreGrave("la form non ha inviato il campo file!");
                } else {
                    //informazioni
                    String nome_e_path = file.getName();
                    String estensione = FilenameUtils.getExtension(FilenameUtils.getName(nome_e_path));
                    String nome_senza_estensione = FilenameUtils.getBaseName(FilenameUtils.getName(nome_e_path));
                    infofile.put("nome_completo", nome_senza_estensione + "." + estensione);
                    infofile.put("estensione", estensione);
                    infofile.put("nome_senza_estensione", nome_senza_estensione);
                    infofile.put("dimensione", file.getSize());
                    infofile.put("input_stream", file.getInputStream());
                    infofile.put("content_type", file.getContentType());
                }

            } catch (FileUploadException ex) {
                Logger.getLogger(upload_user_img.class.getName()).log(Level.SEVERE, null, ex);
                throw new ErroreGrave("errore libreria apache!");
            }

        }
        return infofile;
    }

    //funzione (richiamata da memorizzaImmagine) che calcola il digest del file
    //e lo memorizza nel file system
    private void uploadImmagine(Map info) throws ErroreGrave {
        String cartella = getServletContext().getInitParameter("system.image_directory");
        String sdigest = "";
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            File temp_file = File.createTempFile("upload_", "_temp",
                    new File(getServletContext().getRealPath(cartella)));
            InputStream is = (InputStream) info.get("input_stream");
            OutputStream os = new FileOutputStream(temp_file);
            byte[] buffer = new byte[1024];
            int read;
            while ((read = is.read(buffer)) > 0) {
                //durante la copia, aggreghiamo i byte del file nel digest sha-1
                os.write(buffer, 0, read);
                md.update(buffer, 0, read);
            }
            is.close();
            os.close();
            //covertiamo il digest in una stringa
            byte[] digest = md.digest();
            for (byte b : digest) {
                sdigest += String.valueOf(b);
            }
            //aggiungo il digest alle informazioni sul file
            info.put("digest", sdigest);
            //L'immagine sar salvata con il digest + l'estensione del file
            File uploaded_file = new File(getServletContext().getRealPath(cartella) + File.separatorChar + sdigest
                    + "." + info.get("estensione"));
            if (!uploaded_file.exists()) {
                temp_file.renameTo(uploaded_file);
            } else {
                temp_file.delete();
            }
        } catch (Exception ex) {
            throw new ErroreGrave("operazioni sul file! " + ex.getMessage());
        }
    }

    //
    private Boolean creaThumbnail(Immagine img, Map info) {
        String cartella_img = getServletContext().getInitParameter("system.image_directory");
        String file_img = img.getFile().substring(img.getFile().indexOf("/"));
        String path_img = getServletContext().getRealPath(cartella_img);
        String cartella_thumb = getServletContext().getInitParameter("system.thumb_directory");
        String path_thumb = getServletContext().getRealPath(cartella_thumb);
        int altezza_thumb = 250;
        int larghezza_thumb = 250;
        BufferedImage thumb = new BufferedImage(larghezza_thumb, altezza_thumb, BufferedImage.TYPE_INT_RGB);
        String file_thumb = info.get("digest") + "." + info.get("estensione");

        try {
            if (ImageIO.read(new File(path_img + file_img)).getWidth() >= larghezza_thumb) {
                thumb.createGraphics().drawImage(ImageIO.read(new File(path_img + file_img)).getScaledInstance(-1,
                        altezza_thumb, Image.SCALE_SMOOTH), 0, 0, null);
            } else {
                thumb.createGraphics().drawImage(ImageIO.read(new File(path_img + file_img))
                        .getScaledInstance(larghezza_thumb, altezza_thumb, Image.SCALE_SMOOTH), 0, 0, null);
            }

            ImageIO.write(thumb, info.get("estensione").toString(),
                    new File(path_thumb + File.separatorChar + info.get("digest") + "." + info.get("estensione")));
        } catch (IOException ex) {
            return false;
        }
        img.setThumb(cartella_thumb + File.separatorChar + file_thumb);
        return true;
    }

    //funzione che memorizza l'immagine sul DB ritornando null se l'utente ha spazio sufficiente,
    //altrimenti ritorna una stringa di errore senza fare alcuna operazione
    private String memorizzaImmagine(CMSDataLayerImpl datalayer, Map info, Utente U) throws ErroreGrave {
        //controllo spazio disponibile per l'utente
        long spazio_risultante = U.getSpazio_disp_img() - (Long) info.get("dimensione");
        if (spazio_risultante < 0) {
            return "Non si ha abbastanzia spazio disponibile per caricare l'immagine!" + " Byte disponibili: "
                    + U.getSpazio_disp_img() + " - Byte immagine: " + info.get("dimensione");
        }
        //memorizzazione dell'immagine su file system e calcolo digest
        uploadImmagine(info);

        //costruzione current timestamp
        Calendar calendar = Calendar.getInstance();
        Date now = calendar.getTime();
        Timestamp current_timestamp = new Timestamp(now.getTime());
        //
        Immagine img_upload = datalayer.createImmagine();
        Immagine result;

        img_upload.setNome(SecurityLayer.addSlashes(info.get("nome_senza_estensione").toString()));
        img_upload.setDimensione((Long) info.get("dimensione"));
        img_upload.setTipo(info.get("content_type").toString());
        img_upload.setFile(getServletContext().getInitParameter("system.image_directory") + File.separatorChar
                + info.get("digest") + "." + info.get("estensione"));
        img_upload.setDigest(info.get("digest").toString());
        img_upload.setData_upload(current_timestamp);
        img_upload.setUtente(U);
        //creazione thumbnail
        creaThumbnail(img_upload, info);
        //memorizazione su DB
        result = datalayer.addImmagine(img_upload);
        if (result == null) {
            throw new ErroreGrave("Impossibile inserire i dati dell'immagine nel DB!");
        }
        U.setSpazio_disp_img(spazio_risultante);
        Utente ris = datalayer.updateUtente(U);
        if (ris == null) {
            //elimina l'immagine con la thumbnail sul file system e sul DB
            if (datalayer.deleteImmagine(result) == null) {
                throw new ErroreGrave("impossibile eliminare il record dell'immagine dal database!");
            }
            throw new ErroreGrave("Non  stato possibile aggiornare lo spazio immagine dell'utente!");
        }

        return null;
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //verifica validit sessione
        HttpSession s = SecurityLayer.checkSession(request);
        if (s != null) {
            try {
                //DBMS
                DataSource ds = (DataSource) getServletContext().getAttribute("datasource");
                Connection connection = ds.getConnection();

                CMSDataLayerImpl datalayer = new CMSDataLayerImpl(connection);

                Utente U = datalayer.getUtente(SecurityLayer.checkNumeric(s.getAttribute("userid").toString()));
                Map infoFile = prendiInfoFile(request);
                String spazio_non_sufficiente = memorizzaImmagine(datalayer, infoFile, U);
                if (spazio_non_sufficiente == null) {
                    response.sendRedirect("visualizza?pagina=account");
                } else {
                    response.sendRedirect("visualizza?pagina=account&err=" + spazio_non_sufficiente);
                }

            } catch (ErroreGrave ex) {
                Logger.getLogger(upload_user_img.class.getName()).log(Level.SEVERE, null, ex);
                FailureResult res = new FailureResult(getServletContext());
                res.activate(ex.getMessage(), request, response);
            } catch (SQLException ex) {
                Logger.getLogger(upload_user_img.class.getName()).log(Level.SEVERE, null, ex);
                FailureResult res = new FailureResult(getServletContext());
                res.activate(ex.getMessage(), request, response);
            }
        } else {
            response.sendRedirect("visualizza?pagina=home&err=auth");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}