Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") + you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.openmeetings.servlet.outputhandler; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.openmeetings.app.OpenmeetingsVariables; import org.openmeetings.app.data.file.FileProcessor; import org.openmeetings.app.data.file.dao.FileExplorerItemDaoImpl; import org.openmeetings.app.data.user.dao.UsersDaoImpl; import org.openmeetings.app.documents.GenerateImage; import org.openmeetings.app.documents.GeneratePDF; import org.openmeetings.app.documents.GenerateThumbs; import org.openmeetings.app.persistence.beans.user.Users; import org.openmeetings.app.remote.red5.ScopeApplicationAdapter; import org.openmeetings.utils.StoredFile; import org.openmeetings.utils.stringhandlers.StringComparer; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller public class UploadController extends AbstractUploadController { private static final Logger log = Red5LoggerFactory.getLogger(UploadController.class, OpenmeetingsVariables.webAppRootKey); @Autowired private UsersDaoImpl usersDao; @Autowired private ScopeApplicationAdapter scopeApplicationAdapter; @Autowired private GeneratePDF generatePDF; @Autowired private GenerateThumbs generateThumbs; @Autowired private GenerateImage generateImage; @Autowired private FileProcessor fileProcessor; @Autowired private FileExplorerItemDaoImpl fileExplorerItemDao; private String filesString[] = null; @RequestMapping(value = "/file.upload", method = RequestMethod.POST) public void handleFileUpload(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException { UploadInfo info = validate(request, false); try { LinkedHashMap<String, Object> hs = prepareMessage(info); String room_idAsString = request.getParameter("room_id"); if (room_idAsString == null) { throw new ServletException("Missing Room ID"); } Long room_id_to_Store = Long.parseLong(room_idAsString); String isOwnerAsString = request.getParameter("isOwner"); if (isOwnerAsString == null) { throw new ServletException("Missing isOwnerAsString"); } boolean isOwner = false; if (isOwnerAsString.equals("1")) { isOwner = true; } String parentFolderIdAsString = request.getParameter("parentFolderId"); if (parentFolderIdAsString == null) { throw new ServletException("Missing parentFolderId ID"); } Long parentFolderId = Long.parseLong(parentFolderIdAsString); String current_dir = context.getRealPath("/"); MultipartFile multipartFile = info.file; InputStream is = multipartFile.getInputStream(); log.debug("fileSystemName: " + info.filename); HashMap<String, HashMap<String, String>> returnError = fileProcessor.processFile(info.userId, room_id_to_Store, isOwner, is, parentFolderId, info.filename, current_dir, hs, 0L, ""); // externalFilesId, // externalType HashMap<String, String> returnAttributes = returnError.get("returnAttributes"); // Flash cannot read the response of an upload // httpServletResponse.getWriter().print(returnError); hs.put("message", "library"); hs.put("action", "newFile"); hs.put("fileExplorerItem", fileExplorerItemDao.getFileExplorerItemsById( Long.parseLong(returnAttributes.get("fileExplorerItemId").toString()))); hs.put("error", returnError); hs.put("fileName", returnAttributes.get("completeName")); sendMessage(info, hs); } catch (ServletException e) { throw e; } catch (Exception e) { log.error("Exception during upload: ", e); throw new ServletException(e); } } @RequestMapping(value = "/upload.upload", method = RequestMethod.POST) public void handleFormUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { UploadInfo info = validate(request, false); LinkedHashMap<String, Object> hs = prepareMessage(info); String room_id = request.getParameter("room_id"); if (room_id == null) { room_id = "default"; } String roomName = StringUtils.deleteWhitespace(room_id); String moduleName = request.getParameter("moduleName"); if (moduleName == null) { moduleName = "nomodule"; } if (moduleName.equals("nomodule")) { log.debug("module name missed"); return; } boolean userProfile = moduleName.equals("userprofile"); MultipartFile multipartFile = info.file; InputStream is = multipartFile.getInputStream(); String fileSystemName = info.filename; fileSystemName = StringUtils.deleteWhitespace(fileSystemName); // Flash cannot read the response of an upload // httpServletResponse.getWriter().print(returnError); uploadFile(request, userProfile, info.userId, roomName, is, fileSystemName, hs); sendMessage(info, hs); } catch (ServletException e) { throw e; } catch (Exception e) { log.error("Exception during upload: ", e); throw new ServletException(e); } } private LinkedHashMap<String, Object> prepareMessage(UploadInfo info) { LinkedHashMap<String, Object> hs = new LinkedHashMap<String, Object>(); hs.put("user", usersDao.getUser(info.userId)); return hs; } private void sendMessage(UploadInfo info, LinkedHashMap<String, Object> hs) { scopeApplicationAdapter.sendMessageWithClientByPublicSID(hs, info.publicSID); } private void uploadFile(HttpServletRequest request, boolean userProfile, Long userId, String roomName, InputStream is, String fileSystemName, Map<String, Object> hs) throws Exception { HashMap<String, HashMap<String, String>> returnError = new HashMap<String, HashMap<String, String>>(); // Get the current user directory String currentDir = context.getRealPath("/"); String workingDir = currentDir + OpenmeetingsVariables.UPLOAD_DIR + File.separatorChar + roomName + File.separatorChar; log.debug("workingDir: " + workingDir); File localFolder = new File(workingDir); if (!localFolder.exists()) { localFolder.mkdirs(); } // Check variable to see if this file is a presentation int dotidx = fileSystemName.lastIndexOf('.'); String newFileName = StringComparer.getInstance().compareForRealPaths(fileSystemName.substring(0, dotidx)); String newFileExtDot = fileSystemName.substring(dotidx, fileSystemName.length()).toLowerCase(); String newFileExt = newFileExtDot.substring(1); // trim long names cause cannot output that final int MAX_FILE_NAME_LENGTH = 30; if (newFileName.length() >= MAX_FILE_NAME_LENGTH) { newFileName = newFileName.substring(0, MAX_FILE_NAME_LENGTH); } StoredFile storedFile = new StoredFile(newFileName, newFileExt); // check if this is a a file that can be converted by // openoffice-service boolean canBeConverted = storedFile.isConvertable(); boolean isPdf = storedFile.isPdf(); boolean isImage = storedFile.isImage(); boolean isAsIs = storedFile.isAsIs(); String completeName = ""; // add outputfolders for profiles if (userProfile) { // User Profile Update this.deleteUserProfileFilesStoreTemp(currentDir, userId); completeName = currentDir + OpenmeetingsVariables.UPLOAD_DIR + File.separatorChar + "profiles" + File.separatorChar; File f = new File(completeName); if (!f.exists()) { boolean c = f.mkdir(); if (!c) { log.error("cannot write to directory"); // System.out.println("cannot write to directory"); } } completeName += ScopeApplicationAdapter.profilesPrefix + userId + File.separatorChar; File f2 = new File(completeName); if (!f2.exists()) { boolean c = f2.mkdir(); if (!c) { log.error("cannot write to directory"); // System.out.println("cannot write to directory"); } } } // if it is a presenation it will be copied to another // place if (isAsIs) { // check if this is a room file or UserProfile if (userProfile) { completeName += newFileName; } else { completeName = workingDir + newFileName; } } else if (canBeConverted || isPdf || isImage) { // check if this is a room file or UserProfile // add Temp folder structure String workingDirPpt = currentDir + OpenmeetingsVariables.UPLOAD_TEMP_DIR + File.separatorChar + ((userProfile) ? "profiles" + File.separatorChar + ScopeApplicationAdapter.profilesPrefix + userId : roomName) + File.separatorChar; localFolder = new File(workingDirPpt); if (!localFolder.exists()) { localFolder.mkdirs(); } completeName = workingDirPpt + newFileName; } else { return; } File f = new File(completeName + newFileExtDot); if (f.exists()) { int recursiveNumber = 0; String tempd = completeName + "_" + recursiveNumber; while (f.exists()) { recursiveNumber++; tempd = completeName + "_" + recursiveNumber; f = new File(tempd + newFileExtDot); } completeName = tempd; } log.debug("write file to : " + completeName + newFileExtDot); FileOutputStream fos = new FileOutputStream(completeName + newFileExtDot); byte[] buffer = new byte[1024]; int len = 0; while (len != (-1)) { len = is.read(buffer, 0, 1024); if (len != (-1)) fos.write(buffer, 0, len); } fos.close(); is.close(); log.debug("canBeConverted: " + canBeConverted); if (canBeConverted) { // convert to pdf, thumbs, swf and xml-description returnError = generatePDF.convertPDF(currentDir, newFileName, newFileExtDot, roomName, true, completeName); } else if (isPdf) { boolean isEncrypted = true; log.debug("isEncrypted :: " + isEncrypted); if (isEncrypted) { // Do convert pdf to other pdf first String inputfile = completeName + newFileExtDot; completeName = completeName + "_N_E"; newFileName = newFileName + "_N_E"; String outputfile = completeName + newFileExtDot; generateThumbs.decodePDF(inputfile, outputfile); File f_old = new File(inputfile); if (f_old.exists()) { f_old.delete(); } } // convert to thumbs, swf and xml-description returnError = generatePDF.convertPDF(currentDir, newFileName, newFileExtDot, roomName, false, completeName); // returnError.put("decodePDF", returnError2); } else if (isImage && !isAsIs) { log.debug("##### isImage! userProfilePic: " + userProfile); if (userProfile) { // User Profile Update this.deleteUserProfileFiles(currentDir, userId); // convert it to JPG returnError = generateImage.convertImageUserProfile(currentDir, newFileName, newFileExtDot, userId, newFileName, false); } else { // convert it to JPG log.debug("##### convert it to JPG: " + userProfile); returnError = generateImage.convertImage(currentDir, newFileName, newFileExtDot, roomName, newFileName, false); } } else if (isAsIs) { if (userProfile) { // User Profile Update this.deleteUserProfileFiles(currentDir, userId); // is UserProfile Picture HashMap<String, String> processThumb1 = generateThumbs.generateThumb("_chat_", currentDir, completeName, 40); HashMap<String, String> processThumb2 = generateThumbs.generateThumb("_profile_", currentDir, completeName, 126); HashMap<String, String> processThumb3 = generateThumbs.generateThumb("_big_", currentDir, completeName, 240); returnError.put("processThumb1", processThumb1); returnError.put("processThumb2", processThumb2); returnError.put("processThumb3", processThumb3); File fileNameToStore = new File(completeName + ".jpg"); String pictureuri = fileNameToStore.getName(); Users us = usersDao.getUser(userId); us.setUpdatetime(new java.util.Date()); us.setPictureuri(pictureuri); usersDao.updateUser(us); //FIXME: After updating the picture url all other users should refresh } else { HashMap<String, String> processThumb = generateThumbs.generateThumb("_thumb_", currentDir, completeName, 50); returnError.put("processThumb", processThumb); } } hs.put("message", "library"); hs.put("action", "newFile"); hs.put("error", returnError); hs.put("fileName", completeName); } private void deleteUserProfileFilesStoreTemp(String current_dir, Long users_id) throws Exception { String working_imgdir = current_dir + OpenmeetingsVariables.UPLOAD_DIR + File.separatorChar + "profiles" + File.separatorChar + ScopeApplicationAdapter.profilesPrefix + users_id + File.separatorChar; File f = new File(working_imgdir); if (f.exists() && f.isDirectory()) { this.filesString = f.list(); } } private void deleteUserProfileFiles(String current_dir, Long users_id) throws Exception { String working_imgdir = current_dir + OpenmeetingsVariables.UPLOAD_DIR + File.separatorChar + "profiles" + File.separatorChar + ScopeApplicationAdapter.profilesPrefix + users_id + File.separatorChar; for (int i = 0; i < this.filesString.length; i++) { String fileName = filesString[i]; File subf = new File(working_imgdir + fileName); subf.delete(); } } }