package org.aplikator.server; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.logging.Logger; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.aplikator.client.local.widgets.BinaryFieldWidget; import org.aplikator.server.persistence.tempstore.TempstoreFactory; @WebServlet( name = "FileUploadServlet", urlPatterns = {"/upload"}) public class FileUploadServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private static final Logger LOG = Logger.getLogger(FileUploadServlet.class.getName()); @SuppressWarnings("unchecked") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); // create a factory for disk-based file items and an upload handler DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); FileUploadListener listener = new FileUploadListener(); HttpSession session = request.getSession(); LOG.fine("FILE UPLOAD session (post) = " + session.getId()); session.setAttribute("progress", listener); upload.setProgressListener(listener); // parse the request to retrieve the individual items List<FileItem> items; try { items = upload.parseRequest(request); } catch (FileUploadException e) { throw new ServletException("File upload failed", e); } // handle the individual items appropriately String entityId = ""; String propertyId = ""; int primaryKey = 0; String filename = ""; String fileId = ""; for (FileItem item : items) { // code here to process the file if (item.isFormField()) { if (BinaryFieldWidget.ENTITY_ID.equals(item.getFieldName())) { entityId = item.getString(); continue; } if (BinaryFieldWidget.PROPERTY_ID.equals(item.getFieldName())) { propertyId = item.getString(); continue; } if (BinaryFieldWidget.PRIMARY_KEY_ID.equals(item.getFieldName())) { primaryKey = Integer.parseInt(item.getString()); continue; } } else { filename = item.getName(); fileId = TempstoreFactory.getTempstore().store(filename, item.getInputStream(), true); } } response.setContentType("text/plain"); OutputStream os = response.getOutputStream(); os.write(fileId.getBytes()); os.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); FileUploadListener listener = (FileUploadListener) session.getAttribute("progress"); if (listener == null) { listener = new FileUploadListener(); } if (request.getParameter("reset") != null) { listener.update(0, 0, 0); } StringBuilder msg = new StringBuilder(); msg.append(formatSize(listener.getBytesRead())); msg.append("/"); msg.append(formatSize(listener.getContentLength())); OutputStream os = response.getOutputStream(); os.write(msg.toString().getBytes()); os.close(); } private String formatSize(long bytes) { long kBytes = bytes / 1024; if (kBytes > 1024) { return kBytes / 1024 + "Mb"; } else { return kBytes + "kb"; } } }