Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java =================================================================== diff -u -r234809e3e6cc8d1978aa128d8d2cd91ccea41fb9 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java (.../IResourceService.java) (revision 234809e3e6cc8d1978aa128d8d2cd91ccea41fb9) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/IResourceService.java (.../IResourceService.java) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.rsrc.service; +import java.io.File; import java.util.Collection; import java.util.List; import java.util.SortedSet; @@ -41,11 +42,10 @@ import org.lamsfoundation.lams.tool.rsrc.model.ResourceSession; import org.lamsfoundation.lams.tool.rsrc.model.ResourceUser; import org.lamsfoundation.lams.tool.service.ICommonToolService; -import org.springframework.web.multipart.MultipartFile; /** * Interface that defines the contract that all ShareResource service provider must follow. - * + * * @author Dapeng.Ni */ public interface IResourceService extends ICommonToolService { @@ -79,11 +79,8 @@ /** * Upload resource item file to repository. i.e., single file, websize zip file, or learning object zip file. * - * @param item - * @param file - * @throws UploadResourceFileException */ - void uploadResourceItemFile(ResourceItem item, MultipartFile file) throws UploadResourceFileException; + void uploadResourceItemFile(ResourceItem item, File file) throws UploadResourceFileException; // ********** for user methods ************* /** @@ -111,7 +108,7 @@ // ********** Repository methods *********************** /** * Delete file from repository. - * + * * @throws RepositoryCheckedException * @throws InvalidParameterException */ Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java =================================================================== diff -u -r815b617ce48bcd3dc0a36aa32630ca55d4c21715 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java (.../ResourceServiceImpl.java) (revision 815b617ce48bcd3dc0a36aa32630ca55d4c21715) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/service/ResourceServiceImpl.java (.../ResourceServiceImpl.java) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -25,6 +25,7 @@ import java.io.File; import java.io.FileFilter; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -101,7 +102,6 @@ import org.lamsfoundation.lams.util.zipfile.ZipFileUtil; import org.lamsfoundation.lams.util.zipfile.ZipFileUtilException; import org.lamsfoundation.lams.web.util.AttributeNames; -import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -604,12 +604,12 @@ * @throws RepositoryCheckedException * @throws InvalidParameterException */ - private NodeKey processFile(MultipartFile file) throws UploadResourceFileException { + private NodeKey processFile(File file) throws UploadResourceFileException { NodeKey node = null; - if ((file != null) && !StringUtils.isEmpty(file.getOriginalFilename())) { - String fileName = file.getOriginalFilename(); + if ((file != null) && !StringUtils.isEmpty(file.getName())) { + String fileName = file.getName(); try { - node = resourceToolContentHandler.uploadFile(file.getInputStream(), fileName, file.getContentType()); + node = resourceToolContentHandler.uploadFile(new FileInputStream(file), fileName, null); } catch (InvalidParameterException e) { throw new UploadResourceFileException( messageService.getMessage("error.msg.invaid.param.upload") + " " + e.getMessage()); @@ -640,11 +640,10 @@ } @Override - public void uploadResourceItemFile(ResourceItem item, MultipartFile file) throws UploadResourceFileException { + public void uploadResourceItemFile(ResourceItem item, File file) throws UploadResourceFileException { try { - InputStream is = file.getInputStream(); - String fileName = file.getOriginalFilename(); - String fileType = file.getContentType(); + InputStream is = new FileInputStream(file); + String fileName = file.getName(); // For file only upload one sigle file if (item.getType() == ResourceConstants.RESOURCE_TYPE_FILE) { NodeKey nodeKey = processFile(file); @@ -679,7 +678,6 @@ item.setFileVersionId(nodeKey.getVersion()); } // create the package from the directory contents - item.setFileType(fileType); item.setFileName(fileName); } catch (ZipFileUtilException e) { log.error(messageService.getMessage("error.msg.zip.file.exception") + " : " + e.toString()); @@ -1052,7 +1050,7 @@ public List getConfidenceLevels(Long toolSessionId) { return null; } - + @Override public boolean isUserGroupLeader(Long userId, Long toolSessionId) { return false; Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/AuthoringController.java =================================================================== diff -u -r26661ca85899e95649257c3d5e59eb6b9841ad3c -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 26661ca85899e95649257c3d5e59eb6b9841ad3c) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/AuthoringController.java (.../AuthoringController.java) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.rsrc.web.controller; +import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -62,9 +63,7 @@ import org.lamsfoundation.lams.tool.rsrc.web.form.ResourcePedagogicalPlannerForm; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.CommonConstants; -import org.lamsfoundation.lams.util.Configuration; -import org.lamsfoundation.lams.util.ConfigurationKeys; -import org.lamsfoundation.lams.util.FileValidatorUtil; +import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; @@ -87,7 +86,7 @@ @RequestMapping("/authoring") public class AuthoringController { private static Logger log = Logger.getLogger(AuthoringController.class); - + private static final int INIT_INSTRUCTION_COUNT = 2; private static final String INSTRUCTION_ITEM_DESC_PREFIX = "instructionItemDesc"; private static final String INSTRUCTION_ITEM_COUNT = "instructionCount"; @@ -110,7 +109,9 @@ */ @RequestMapping("/removeItemAttachment") private String removeItemAttachment(HttpServletRequest request) { - request.setAttribute("resourceItemForm", null); + ResourceItemForm resourceItemForm = new ResourceItemForm(); + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); + request.setAttribute("resourceItemForm", resourceItemForm); return "pages/authoring/parts/itemattachment"; } @@ -164,10 +165,13 @@ case 1: return "pages/authoring/parts/addurl"; case 2: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addfile"; case 3: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addwebsite"; case 4: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addlearningobject"; default: throw new IllegalArgumentException("Unknown item type" + item.getType()); @@ -193,10 +197,13 @@ case 1: return "pages/authoring/parts/addurl"; case 2: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addfile"; case 3: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addwebsite"; case 4: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addlearningobject"; default: throw new IllegalArgumentException("Unknown item type" + type); @@ -225,10 +232,13 @@ case 1: return "pages/authoring/parts/addurl"; case 2: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addfile"; case 3: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addwebsite"; case 4: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addlearningobject"; default: throw new IllegalArgumentException("Unknown item type" + resourceItemForm.getItemType()); @@ -385,7 +395,7 @@ if (resource == null) { resource = resourceService.getDefaultContent(contentId); if (resource.getResourceItems() != null) { - items = new ArrayList(resource.getResourceItems()); + items = new ArrayList<>(resource.getResourceItems()); } else { items = null; } @@ -466,8 +476,8 @@ * all resource item, information etc. */ @RequestMapping(value = "/update", method = RequestMethod.POST) - private String updateContent(@ModelAttribute("authoringForm") ResourceForm authoringForm, HttpServletRequest request) - throws Exception { + private String updateContent(@ModelAttribute("authoringForm") ResourceForm authoringForm, + HttpServletRequest request) throws Exception { SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(authoringForm.getSessionMapID()); @@ -539,7 +549,7 @@ List delResourceItemList = getDeletedResourceItemList(sessionMap); iter = delResourceItemList.iterator(); while (iter.hasNext()) { - ResourceItem item = (ResourceItem) iter.next(); + ResourceItem item = iter.next(); iter.remove(); if (item.getUid() != null) { resourceService.deleteResourceItem(item.getUid()); @@ -549,7 +559,7 @@ List delItemAttList = getDeletedItemAttachmentList(sessionMap); iter = delItemAttList.iterator(); while (iter.hasNext()) { - ResourceItem delAtt = (ResourceItem) iter.next(); + ResourceItem delAtt = iter.next(); iter.remove(); } @@ -726,21 +736,22 @@ * ResourceItem.createDate and ResourceItem.createBy, which need be set * when persisting this resource item. */ + @SuppressWarnings("unchecked") private void extractFormToResourceItem(HttpServletRequest request, List instructionList, ResourceItemForm itemForm) throws Exception { SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(itemForm.getSessionMapID()); // check whether it is "edit(old item)" or "add(new item)" SortedSet resourceList = getResourceItemList(sessionMap); - int itemIdx = NumberUtils.stringToInt(itemForm.getItemIndex(), -1); + int itemIdx = NumberUtils.toInt(itemForm.getItemIndex(), -1); ResourceItem item = null; if (itemIdx == -1) { // add item = new ResourceItem(); item.setCreateDate(new Timestamp(new Date().getTime())); item.setOrderId(resourceList.size() + 1); - + } else { // edit List rList = new ArrayList<>(resourceList); item = rList.get(itemIdx); @@ -756,34 +767,46 @@ // if the item is edit (not new add) then the getFile may return null // it may throw exception, so put it as first, to avoid other invlidate // update: - if (itemForm.getFile() != null) { - if (type == ResourceConstants.RESOURCE_TYPE_WEBSITE - || type == ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT - || type == ResourceConstants.RESOURCE_TYPE_FILE) { - // if it has old file, and upload a new, then save old to deleteList - ResourceItem delAttItem = new ResourceItem(); - boolean hasOld = false; - if (item.getFileUuid() != null) { - hasOld = true; - // be careful, This new ResourceItem object never be save - // into database - // just temporarily use for saving fileUuid and versionID - // use: - delAttItem.setFileUuid(item.getFileUuid()); - delAttItem.setFileVersionId(item.getFileVersionId()); + + if (type == ResourceConstants.RESOURCE_TYPE_WEBSITE || type == ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT + || type == ResourceConstants.RESOURCE_TYPE_FILE) { + File uploadDir = FileUtil.getTmpFileUploadDir(itemForm.getTmpFileUploadId()); + if (uploadDir.canRead()) { + File[] files = uploadDir.listFiles(); + if (files.length > 1) { + throw new ServletException("Uploaded more than 1 file"); } - //throws UploadResourceFileException - resourceService.uploadResourceItemFile(item, itemForm.getFile()); - - // put it after "upload" to ensure deleted file added into list - // only no exception happens during upload - if (hasOld) { - List delAtt = getDeletedItemAttachmentList(sessionMap); - delAtt.add(delAttItem); + if (files.length == 1) { + // if it has old file, and upload a new, then save old to deleteList + ResourceItem delAttItem = new ResourceItem(); + boolean hasOld = false; + if (item.getFileUuid() != null) { + hasOld = true; + // be careful, This new ResourceItem object never be save + // into database + // just temporarily use for saving fileUuid and versionID + // use: + delAttItem.setFileUuid(item.getFileUuid()); + delAttItem.setFileVersionId(item.getFileVersionId()); + } + + File file = files[0]; + + resourceService.uploadResourceItemFile(item, file); + + FileUtil.deleteTmpFileUploadDir(itemForm.getTmpFileUploadId()); + + // put it after "upload" to ensure deleted file added into list + // only no exception happens during upload + if (hasOld) { + List delAtt = getDeletedItemAttachmentList(sessionMap); + delAtt.add(delAttItem); + } } } } + item.setTitle(itemForm.getTitle()); item.setCreateByAuthor(true); item.setHide(false); @@ -838,28 +861,33 @@ // ActionMessage(ResourceConstants.ERROR_MSG_INVALID_URL)); } } + // if(itemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_WEBSITE // ||itemForm.getItemType() == // ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT){ // if(StringUtils.isBlank(itemForm.getDescription())) // errors.add(ActionMessages.GLOBAL_MESSAGE,new // ActionMessage(ResourceConstants.ERROR_MSG_DESC_BLANK)); // } - if (resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_WEBSITE - || resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT - || resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_FILE) { - // validate item size - if (!FileValidatorUtil.validateFileSize(resourceItemForm.getFile(), false)) { - errorMap.add("GLOBAL", messageService.getMessage("errors.maxfilesize", - new Object[] { Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_MAX_SIZE) })); - } - // for edit validate: file already exist - if (!resourceItemForm.isHasFile() && (resourceItemForm.getFile() == null - || StringUtils.isEmpty(resourceItemForm.getFile().getOriginalFilename()))) { - errorMap.add("GLOBAL", messageService.getMessage(ResourceConstants.ERROR_MSG_FILE_BLANK)); - } - } + // uploads using tmp file upload servlet made following validation obsolete (?) + /* + * if (resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_WEBSITE + * || resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT + * || resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_FILE) { + * // validate item size + * if (!FileValidatorUtil.validateFileSize(resourceItemForm.getFile(), false)) { + * errorMap.add("GLOBAL", messageService.getMessage("errors.maxfilesize", + * new Object[] { Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_MAX_SIZE) })); + * } + * + * // for edit validate: file already exist + * if (!resourceItemForm.isHasFile() && (resourceItemForm.getFile() == null + * || StringUtils.isEmpty(resourceItemForm.getFile().getOriginalFilename()))) { + * errorMap.add("GLOBAL", messageService.getMessage(ResourceConstants.ERROR_MSG_FILE_BLANK)); + * } + * } + */ } @RequestMapping("/initPedagogicalPlannerForm") @@ -888,7 +916,7 @@ ResourceItem resourceItem = null; List newItems = new LinkedList<>(); // we need a copy for later Hibernate-bound processing - LinkedList resourceItems = new LinkedList(taskList.getResourceItems()); + LinkedList resourceItems = new LinkedList<>(taskList.getResourceItems()); Iterator taskListItemIterator = resourceItems.iterator(); /* * Not the case anymore (why?): @@ -942,18 +970,20 @@ resourceService.deleteFromRepository(resourceItem.getFileUuid(), resourceItem.getFileVersionId()); } - resourceService.uploadResourceItemFile(resourceItem, file); + throw new UnsupportedOperationException( + "Temporary file uploading is not implemented for Share Resources yet"); +// resourceService.uploadResourceItemFile(resourceItem, file); } catch (Exception e) { AuthoringController.log.error(e); errorMap.add("GLOBAL", messageService.getMessage("error.msg.io.exception")); request.setAttribute("errorMap", errorMap); pedagogicalPlannerForm.setValid(false); return "pages/authoring/pedagogicalPlannerForm"; } - pedagogicalPlannerForm.setFileName(itemIndex, resourceItem.getFileName()); - pedagogicalPlannerForm.setFileUuid(itemIndex, resourceItem.getFileUuid()); - pedagogicalPlannerForm.setFileVersion(itemIndex, resourceItem.getFileVersionId()); - pedagogicalPlannerForm.setFile(itemIndex, null); +// pedagogicalPlannerForm.setFileName(itemIndex, resourceItem.getFileName()); +// pedagogicalPlannerForm.setFileUuid(itemIndex, resourceItem.getFileUuid()); +// pedagogicalPlannerForm.setFileVersion(itemIndex, resourceItem.getFileVersionId()); +// pedagogicalPlannerForm.setFile(itemIndex, null); } } itemIndex++; @@ -1020,12 +1050,12 @@ // return null to close this window return "pages/authoring/parts/itemlist"; } - + @SuppressWarnings("unchecked") private SessionMap getSessionMap(HttpServletRequest request) { String sessionMapID = WebUtil.readStrParam(request, ResourceConstants.ATTR_SESSION_MAP_ID); request.setAttribute(ResourceConstants.ATTR_SESSION_MAP_ID, sessionMapID); return (SessionMap) request.getSession().getAttribute(sessionMapID); - } + } } Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/LearningController.java =================================================================== diff -u -r68d56bcf4ea82273d7d3beb10809cb638d9b4e7d -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/LearningController.java (.../LearningController.java) (revision 68d56bcf4ea82273d7d3beb10809cb638d9b4e7d) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/controller/LearningController.java (.../LearningController.java) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.tool.rsrc.web.controller; +import java.io.File; import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -34,6 +35,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -56,10 +58,7 @@ import org.lamsfoundation.lams.tool.rsrc.web.form.ReflectionForm; import org.lamsfoundation.lams.tool.rsrc.web.form.ResourceItemForm; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; -import org.lamsfoundation.lams.util.Configuration; -import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.FileUtil; -import org.lamsfoundation.lams.util.FileValidatorUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; @@ -102,6 +101,8 @@ private String addfile(ResourceItemForm resourceItemForm, HttpServletRequest request) { resourceItemForm.setMode(WebUtil.readStrParam(request, AttributeNames.ATTR_MODE)); resourceItemForm.setSessionMapID(WebUtil.readStrParam(request, ResourceConstants.ATTR_SESSION_MAP_ID)); + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); + return "pages/learning/addfile"; } @@ -333,9 +334,11 @@ * @param request * @param response * @return + * @throws ServletException */ @RequestMapping(value = "/saveOrUpdateItem", method = RequestMethod.POST) - private String saveOrUpdateItem(ResourceItemForm resourceItemForm, HttpServletRequest request) { + private String saveOrUpdateItem(ResourceItemForm resourceItemForm, HttpServletRequest request) + throws ServletException { // get back SessionMap String sessionMapID = request.getParameter(ResourceConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() @@ -354,6 +357,7 @@ case 1: return "pages/authoring/parts/addurl"; case 2: + resourceItemForm.setTmpFileUploadId(FileUtil.generateTmpFileUploadId()); return "pages/authoring/parts/addfile"; default: throw new IllegalArgumentException("Unknown item type" + resourceItemForm.getItemType()); @@ -373,22 +377,35 @@ // special attribute for URL or FILE if (type == ResourceConstants.RESOURCE_TYPE_FILE) { - try { - resourceService.uploadResourceItemFile(item, resourceItemForm.getFile()); - } catch (UploadResourceFileException e) { - errorMap.add("GLOBAL", - messageService.getMessage("error.upload.failed", new Object[] { e.getMessage() })); - request.setAttribute("errorMap", errorMap); - return "pages/authoring/parts/addurl"; - } - item.setOpenUrlNewWindow(resourceItemForm.isOpenUrlNewWindow()); + File uploadDir = FileUtil.getTmpFileUploadDir(resourceItemForm.getTmpFileUploadId()); + if (uploadDir.canRead()) { + File[] files = uploadDir.listFiles(); + if (files.length > 1) { + throw new ServletException("Uploaded more than 1 file"); + } + if (files.length == 0) { + throw new ServletException("No file uploaded"); + } + try { + resourceService.uploadResourceItemFile(item, files[0]); + + FileUtil.deleteTmpFileUploadDir(resourceItemForm.getTmpFileUploadId()); + } catch (UploadResourceFileException e) { + errorMap.add("GLOBAL", + messageService.getMessage("error.upload.failed", new Object[] { e.getMessage() })); + request.setAttribute("errorMap", errorMap); + return "pages/authoring/parts/addurl"; + } + item.setOpenUrlNewWindow(resourceItemForm.isOpenUrlNewWindow()); + } else { + throw new ServletException("No file uploaded"); + } } else if (type == ResourceConstants.RESOURCE_TYPE_URL) { item.setUrl(resourceItemForm.getUrl()); item.setOpenUrlNewWindow(resourceItemForm.isOpenUrlNewWindow()); } // save and update session - ResourceSession resSession = resourceService.getResourceSessionBySessionId(sessionId); if (resSession == null) { LearningController.log.error("Failed update ResourceSession by ID[" + sessionId + "]"); @@ -415,11 +432,11 @@ resourceService.notifyTeachersOnAssigmentSumbit(sessionId, resourceUser); } - if (resource.isNotifyTeachersOnFileUpload() && (type == ResourceConstants.RESOURCE_TYPE_FILE)) { - resourceService.notifyTeachersOnFileUpload(resource.getContentId(), sessionId, sessionMapID, - resourceUser.getFirstName() + " " + resourceUser.getLastName(), item.getUid(), - resourceItemForm.getFile().getOriginalFilename()); - } +// if (resource.isNotifyTeachersOnFileUpload() && (type == ResourceConstants.RESOURCE_TYPE_FILE)) { +// resourceService.notifyTeachersOnFileUpload(resource.getContentId(), sessionId, sessionMapID, +// resourceUser.getFirstName() + " " + resourceUser.getLastName(), item.getUid(), +// resourceItemForm.getFile().getOriginalFilename()); +// } return "pages/learning/success"; } @@ -617,23 +634,35 @@ if ((resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_WEBSITE) || (resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_LEARNING_OBJECT) || (resourceItemForm.getItemType() == ResourceConstants.RESOURCE_TYPE_FILE)) { + File uploadDir = FileUtil.getTmpFileUploadDir(resourceItemForm.getTmpFileUploadId()); + if (uploadDir.canRead()) { + File[] files = uploadDir.listFiles(); + if (files.length > 1) { + errorMap.add("GLOBAL", "Uploaded more than 1 file"); + } - if ((resourceItemForm.getFile() != null) - && FileUtil.isExecutableFile(resourceItemForm.getFile().getOriginalFilename())) { - errorMap.add("Global", messageService.getMessage("error.attachment.executable")); + if (files.length == 0) { + errorMap.add("GLOBAL", "No file uploaded"); + } + } else { + errorMap.add("GLOBAL", "No file uploaded"); } - - // validate item size - if (!FileValidatorUtil.validateFileSize(resourceItemForm.getFile(), false)) { - errorMap.add("GLOBAL", messageService.getMessage("errors.maxfilesize", - new Object[] { Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_MAX_SIZE) })); - } - - // for edit validate: file already exist - if (!resourceItemForm.isHasFile() && ((resourceItemForm.getFile() == null) - || StringUtils.isEmpty(resourceItemForm.getFile().getOriginalFilename()))) { - errorMap.add("GLOBAL", messageService.getMessage(ResourceConstants.ERROR_MSG_FILE_BLANK)); - } +// if ((resourceItemForm.getFile() != null) +// && FileUtil.isExecutableFile(resourceItemForm.getFile().getOriginalFilename())) { +// errorMap.add("Global", messageService.getMessage("error.attachment.executable")); +// } +// +// // validate item size +// if (!FileValidatorUtil.validateFileSize(resourceItemForm.getFile(), false)) { +// errorMap.add("GLOBAL", messageService.getMessage("errors.maxfilesize", +// new Object[] { Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_MAX_SIZE) })); +// } +// +// // for edit validate: file already exist +// if (!resourceItemForm.isHasFile() && ((resourceItemForm.getFile() == null) +// || StringUtils.isEmpty(resourceItemForm.getFile().getOriginalFilename()))) { +// errorMap.add("GLOBAL", messageService.getMessage(ResourceConstants.ERROR_MSG_FILE_BLANK)); +// } } } Index: lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/form/ResourceItemForm.java =================================================================== diff -u -r0a46648d9547d3fca73e1931d4e628be7e1acd7b -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/form/ResourceItemForm.java (.../ResourceItemForm.java) (revision 0a46648d9547d3fca73e1931d4e628be7e1acd7b) +++ lams_tool_larsrc/src/java/org/lamsfoundation/lams/tool/rsrc/web/form/ResourceItemForm.java (.../ResourceItemForm.java) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -23,8 +23,6 @@ package org.lamsfoundation.lams.tool.rsrc.web.form; -import org.springframework.web.multipart.MultipartFile; - /** * Resource Item Form. * @@ -47,7 +45,7 @@ private Long fileUuid; private Long fileVersionId; private String fileName; - private MultipartFile file; + private String tmpFileUploadId; private boolean allowRating; private boolean allowComments; @@ -59,12 +57,12 @@ this.description = description; } - public MultipartFile getFile() { - return file; + public String getTmpFileUploadId() { + return tmpFileUploadId; } - public void setFile(MultipartFile file) { - this.file = file; + public void setTmpFileUploadId(String tmpFileUploadId) { + this.tmpFileUploadId = tmpFileUploadId; } public String getTitle() { Index: lams_tool_larsrc/web/includes/javascript/rsrccommon.js =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/includes/javascript/rsrccommon.js (.../rsrccommon.js) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_larsrc/web/includes/javascript/rsrccommon.js (.../rsrccommon.js) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -19,3 +19,78 @@ $("#saveCancelButtons .btn").prop('disabled', false); } + /** + * Initialised Uppy as the file upload widget + */ + function initFileUpload(tmpFileUploadId, extensionValidation, language) { + var uppyProperties = { + // upload immediately + autoProceed: true, + allowMultipleUploads: true, + debug: false, + restrictions: { + // taken from LAMS configuration + maxFileSize: +UPLOAD_FILE_LARGE_MAX_SIZE, + maxNumberOfFiles: 1 + }, + meta: { + // all uploaded files go to this subdir in LAMS tmp dir + // its format is: upload__ + 'tmpFileUploadId' : tmpFileUploadId, + 'largeFilesAllowed' : true + }, + onBeforeFileAdded: extensionValidation + }; + + switch(language) { + case 'es' : uppyProperties.locale = Uppy.locales.es_ES; break; + case 'fr' : uppyProperties.locale = Uppy.locales.fr_FR; break; + case 'el' : uppyProperties.locale = Uppy.locales.el_GR; break; + } + + + // global variable + uppy = Uppy.Core(uppyProperties); + // upload using Ajax + uppy.use(Uppy.XHRUpload, { + endpoint: LAMS_URL + 'tmpFileUpload', + fieldName : 'file', + // files are uploaded one by one + limit : 1 + }); + + uppy.use(Uppy.Dashboard, { + target: '#image-upload-area', + inline: true, + height: 300, + width: '100%', + showProgressDetails : true, + hideRetryButton : true, + hideCancelButton : true, + showRemoveButtonAfterComplete: true, + proudlyDisplayPoweredByUppy: false + }); + + uppy.use(Uppy.Webcam, { + target: Uppy.Dashboard, + modes: ['picture'] + }); + + uppy.on('upload-success', (file, response) => { + // if file name was modified by server, reflect it in Uppy + file.meta.name = response.body.name; + }); + + uppy.on('file-removed', (file, reason) => { + if (reason === 'removed-by-user') { + // delete file from temporary folder on server + $.ajax({ + url : LAMS_URL + 'tmpFileUploadDelete', + data : { + 'tmpFileUploadId' : tmpFileUploadId, + 'name' : file.meta.name + } + }) + } + }) + } Index: lams_tool_larsrc/web/pages/authoring/parts/addfile.jsp =================================================================== diff -u -r26661ca85899e95649257c3d5e59eb6b9841ad3c -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/authoring/parts/addfile.jsp (.../addfile.jsp) (revision 26661ca85899e95649257c3d5e59eb6b9841ad3c) +++ lams_tool_larsrc/web/pages/authoring/parts/addfile.jsp (.../addfile.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -1,59 +1,50 @@ <%@ include file="/common/taglibs.jsp"%> -<%@ page import="org.lamsfoundation.lams.util.Configuration" %> -<%@ page import="org.lamsfoundation.lams.util.ConfigurationKeys" %> -<%@ page import="org.lamsfoundation.lams.util.FileValidatorUtil" %> -<%=Configuration.get(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE)%> -<%=FileValidatorUtil.formatSize(Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE))%> -<%=Configuration.get(ConfigurationKeys.EXE_EXTENSIONS)%> <%@ include file="addheader.jsp"%> @@ -13,11 +22,30 @@ - + + + + + + + + + + + + + + Index: lams_tool_larsrc/web/pages/authoring/parts/addlearningobject.jsp =================================================================== diff -u -r26661ca85899e95649257c3d5e59eb6b9841ad3c -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/authoring/parts/addlearningobject.jsp (.../addlearningobject.jsp) (revision 26661ca85899e95649257c3d5e59eb6b9841ad3c) +++ lams_tool_larsrc/web/pages/authoring/parts/addlearningobject.jsp (.../addlearningobject.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -1,59 +1,50 @@ <%@ include file="/common/taglibs.jsp"%> -<%@ page import="org.lamsfoundation.lams.util.Configuration" %> -<%@ page import="org.lamsfoundation.lams.util.ConfigurationKeys" %> -<%@ page import="org.lamsfoundation.lams.util.FileValidatorUtil" %> -<%=Configuration.get(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE)%> -<%=FileValidatorUtil.formatSize(Configuration.getAsInt(ConfigurationKeys.UPLOAD_FILE_LARGE_MAX_SIZE))%> <%@ include file="addheader.jsp"%> Index: lams_tool_larsrc/web/pages/authoring/parts/addwebsite.jsp =================================================================== diff -u -r26661ca85899e95649257c3d5e59eb6b9841ad3c -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/authoring/parts/addwebsite.jsp (.../addwebsite.jsp) (revision 26661ca85899e95649257c3d5e59eb6b9841ad3c) +++ lams_tool_larsrc/web/pages/authoring/parts/addwebsite.jsp (.../addwebsite.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -15,45 +15,43 @@ $(document).ready(function(){ $('#title').focus(); }); - - $.validator.addMethod("fileType", function(value, element) { - return this.optional(element) || element.files[0].type == 'application/zip' || element.files[0].type == 'application/x-zip-compressed'; - }); - $.validator.addMethod('validateSize', function (value, element, param) { - return validateFileSize(element.files[0], param); - }, '${UPLOAD_FILE_MAX_SIZE_AS_USER_STRING}'); + var extensionValidation = function(currentFile, files) { + var name = currentFile.data.name, + extensionIndex = name.lastIndexOf('.'), + valid = extensionIndex < 0 || name.substring(extensionIndex).trim() == '.zip'; + if (!valid) { + uppy.info('', 'error', 10000); + } + + return valid; + } + - + $.validator.addMethod('requireFileCount', function (value, element, param) { + return uppy.getFiles().length >= +param; + }, ''); + + $( "#resourceItemForm" ).validate({ ignore: [], errorClass: "text-danger", wrapper: "span", rules: { - file: { - required: true, - fileType: true, - validateSize: UPLOAD_FILE_LARGE_MAX_SIZE, - }, + 'tmpFileUploadId' : { + requireFileCount: 1 + }, title: { required: true } }, messages : { - file : { - required : ' ', - fileType: '' - }, title : { required : ' ' } }, errorPlacement: function(error, element) { - if (element.hasClass("fileUpload")) { - error.insertAfter(element.parent()); - } else { - error.insertAfter(element); - } + error.insertAfter(element); } }); Index: lams_tool_larsrc/web/pages/authoring/parts/itemattachment.jsp =================================================================== diff -u -r00f10b78ebb353a236d73fdb96ca9fd1ab082602 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/authoring/parts/itemattachment.jsp (.../itemattachment.jsp) (revision 00f10b78ebb353a236d73fdb96ca9fd1ab082602) +++ lams_tool_larsrc/web/pages/authoring/parts/itemattachment.jsp (.../itemattachment.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -6,8 +6,12 @@ - - + +
+
+ \ No newline at end of file Index: lams_tool_larsrc/web/pages/learning/addfile.jsp =================================================================== diff -u -raced7ba6c1e7c5a9a50d3f64d8cdd96dd7e76194 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/learning/addfile.jsp (.../addfile.jsp) (revision aced7ba6c1e7c5a9a50d3f64d8cdd96dd7e76194) +++ lams_tool_larsrc/web/pages/learning/addfile.jsp (.../addfile.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -26,8 +26,9 @@ - - + +
+
@@ -46,50 +47,30 @@
Index: lams_tool_larsrc/web/pages/learning/learning.jsp =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -ra07430557603483e95a40ae22062e79b68a37778 --- lams_tool_larsrc/web/pages/learning/learning.jsp (.../learning.jsp) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_larsrc/web/pages/learning/learning.jsp (.../learning.jsp) (revision a07430557603483e95a40ae22062e79b68a37778) @@ -10,6 +10,7 @@ <%@ include file="/common/header.jsp"%> + <%-- param has higher level for request attribute --%> @@ -27,7 +28,21 @@ - + + + + + + + + + + + + + + +