`

Ext5实现html5的拖拽上传功能

阅读更多
这方面网络上的资源有很多,所以直接上代码了。
ext使用SenchaArchitect开发
后台用的jersey



@POST
	@Path("/upload")
	@Consumes(MediaType.MULTIPART_FORM_DATA)
	public Response upload(@NotBlank @FormDataParam("SID") String sid, @NotNull @FormDataParam("size") Long size,
			@NotNull @FormDataParam("dmsFileId") Long dmsFileId, @FormDataParam("file") InputStream fileInputStream,
			@FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {

		try {
			Boolean valid = sessionsService.checkSessionsValid(sid);
			if (valid == null) {
				throw new Exception("session not exist !");
			}
			if (!valid) {
				throw new Exception("session is invalid !");
			}

			// Get Configuration
			String names[] = { "system.dms.upload.destFolder", "system.dms.upload.maxFilesizeInBytes",
					"system.dms.upload.tempFolder", "system.dms.upload.allowed", };
			Map configurations = configurationsService.getSystemConfigurationsByName(names);

			String destFolder = ((Configurations) configurations.get("system.dms.upload.destFolder")).getDefaultvalue();
			Integer tempMaxFilesizeInBytes = Utils.getInteger(
					((Configurations) configurations.get("system.dms.upload.maxFilesizeInBytes")).getDefaultvalue());
			int maxFilesizeInBytes = -1;
			if (tempMaxFilesizeInBytes != null) {
				maxFilesizeInBytes = tempMaxFilesizeInBytes.intValue();
			}
			String tempDir = ((Configurations) configurations.get("system.dms.upload.tempFolder")).getDefaultvalue();
			boolean allowed = "1"
					.equals(((Configurations) configurations.get("system.dms.upload.allowed")).getDefaultvalue());

			// Create Directorys
			File destDirFile = new File(destFolder);
			if (!destDirFile.exists()) {
				destDirFile.mkdirs();
			}

			File tempDirFile = new File(tempDir);
			if (!tempDirFile.exists()) {
				tempDirFile.mkdirs();
			}

			Sessions session = sessionsService.getSessions(sid);
			Long usersId = session.getUserid();

			int maxSize = 1073741824;
			String fileName = contentDispositionHeader.getFileName();

			// Check dmsFileId if exist
			DmsFiles file = dmsFilesService.findById(DmsFiles.class, dmsFileId);
			if (file == null) {
				throw new Exception("DmsFileId is not exist :" + dmsFileId);
			}

			// Check if file size is too big
			if (!((maxFilesizeInBytes == -1 || maxFilesizeInBytes >= size) && size <= maxSize)) {
				throw new Exception("File Upload FAILED. File is too Big : " + size);
			}

			// Check if dest Folder exist and create it if necessary
			destDirFile = new File(destFolder + dmsFilesService.getRelativIdFolderPath(dmsFileId));
			if (!destDirFile.exists()) {
				destDirFile.mkdirs();
			}

			String datapath = destFolder + dmsFilesService.getRelativIdFilePath(dmsFileId);

			if (!destFolder.endsWith("/") && !destFolder.endsWith("\\")) {
				destFolder += "/";
			}

			// save the file to the server
			saveFile(fileInputStream, datapath);

			// Write DmsFile Info TXT for disaster recovery
			RandomAccessFile recorvery_infoFile = new RandomAccessFile(datapath + ".txt", "rw");
			recorvery_infoFile.writeBytes("Org. Filename: " + fileName + "\r\n");
			recorvery_infoFile.writeBytes("Filesize: " + size + "\r\n");
			recorvery_infoFile.writeBytes("Upload Date: " + new Date() + "\r\n");
			recorvery_infoFile.writeBytes("Upload User ID:" + usersId + "\r\n");
			recorvery_infoFile.writeBytes("DMSFile ID : " + dmsFileId + "\r\n");
			recorvery_infoFile.close();

			dmsFilesService.updateFileDataPath(dmsFileId, datapath);
			//update fileSize
			dmsFilesService.mergeFileSize(dmsFileId, size);

			log.info("File Uploaded succesfully with ID " + dmsFileId);
			log.info("File saved to server location : " + datapath);

			return Response.ok("ok").build();

		} catch (Exception e) {
			log.error(ExceptionUtils.getFullStackTrace(e));
			return Response.serverError().entity(e.getMessage()).build();
		}

	}



在最外层的window上添加代码

   onMainViewportAfterRender: function(component, eOpts) {
        //drage and drop file to upload in explorer file win
        window.ondragenter = function(e)
        {
            e.preventDefault();
        };

        window.ondragover = function(e)
        {
            e.preventDefault();
        };

        window.ondrop = function(e)
        {
            e.preventDefault();
        };

        window.ondragleave = function(e)
        {
            e.preventDefault();
        };


         //xxxxxx  

    }


在文件导航window上添加dropFileToUpload方法
{  localStorage.setItem('dmsId',result);
                                var fd = new FormData();
                                fd.append("file", tempfile);
                                fd.append("SID", localStorage.getItem('sid'));
                                fd.append("size", file.size);
                                fd.append("dmsFileId",result);
                                var xhr = new XMLHttpRequest();
                                xhr.upload.addEventListener("progress", function(){
                                    dropUploadProgress.call(controller,arguments);
                                }, false);
                                xhr.addEventListener("load",function(){
                                    var successFileSize = Number(localStorage.getItem("successFileSize"));
                                    var filesSize = Number(localStorage.getItem("filesSize"));
                                    var failedFileSize = Number(localStorage.getItem("failedFileSize"));
                                    successFileSize++;
                                    localStorage.setItem("successFileSize",successFileSize);

                                    if((successFileSize+failedFileSize)==filesSize){
                                        refreshFileList.call(controller,parentnode.data.folderId,arguments);
                                    }else{
                                       dropFileToUpload(file, controller, tree);
                                    }

                                } , false);
                                xhr.upload.addEventListener("error", function(){
                                    var successFileSize = Number(localStorage.getItem("successFileSize"));
                                    var filesSize = Number(localStorage.getItem("filesSize"));
                                    var failedFileSize = Number(localStorage.getItem("failedFileSize"));
                                    failedFileSize++;
                                    localStorage.setItem("failedFileSize",failedFileSize);

                                    dropUploadFailed.call(controller,arguments);

                                    if((successFileSize+failedFileSize)==filesSize){
                                        refreshFileList.call(controller,parentnode.data.folderId,arguments);
                                    }else{
                                       dropFileToUpload(file, controller, tree);
                                    }

                                }, false);
                                xhr.open("POST", "../../../rest/FileExplorerPortal/upload");
                                xhr.send(fd);
}

  refreshFileList: function(folderID, evt) {
        var progressBar = this.getView().lookupReference('dropFileToUploadProgressBar');
        if(progressBar.isVisible()){
               progressBar.hide();
        }
        progressBar.setValue(0);
        progressBar.updateText('0%');

        var successFileSize = Number(localStorage.getItem("successFileSize"));
        var filesSize = Number(localStorage.getItem("filesSize"));
        var failedFileSize = Number(localStorage.getItem("failedFileSize"));
        if(filesSize>1){
            Ext.Msg.show({
               title:'Result',
               message: 'Upload successful:'+successFileSize+" , Upload failed:"+failedFileSize,
               buttons: Ext.Msg.OK
            });
        }else if(failedFileSize==1){
             Ext.Msg.show({
               title:'Error',
               message: 'The file upload failed, please try again...',
               buttons: Ext.Msg.OK
            });
        }

        if(folderID){
            this.getView().lookupReference('FilesList').store.load({params:{folderId:folderID}});
        }

    },

    dropUploadProgress: function(evt) {
        var successFileSize = localStorage.getItem("successFileSize");
        var filesSize = localStorage.getItem("filesSize");


        var progressBar = this.getView().lookupReference('dropFileToUploadProgressBar');
        if (evt[0].lengthComputable) {
            if(!progressBar.isVisible()){
                progressBar.show();
            }
            var percentComplete = Math.round(evt[0].loaded*100 / evt[0].total);
            var filesInfo = "   ("+successFileSize+"/"+filesSize+")";
            progressBar.setValue(percentComplete/100);
            progressBar.updateText(percentComplete+'%'+filesInfo);
        }else {
            progressBar.updateText('Uploding....');
        }
    },

    dropUploadFailed: function(evt) {
        var progressBar = this.getView().lookupReference('dropFileToUploadProgressBar');
        progressBar.setValue(0);
        progressBar.updateText('0%');
        progressBar.hide();
    },



分享到:
评论

相关推荐

    Ext相册实现文件拖拽,实时上传进度,本地预览

    Ext4+Servlet/Struts2+HTML5实现实时获取文件上传进度、本地预览、文件拖拽上传的相册实例

    Ext相册实现文件拖拽,实时上传进度,本地预览(2012-05-14版)

    2012-05-14更新: 增加了通过资源管理器选择文件功能 修复上传进度显示BUG ...图片浏览器支持拖动、双击最大化/还原、更改尺寸 图片浏览器支持对数据源里面的图片进行导航 图片浏览器图片的放大和缩小

    EXT2.0中文教程

    9.6. JsonView实现用户卡片拖拽与右键菜单 9.7. 下拉列表选择每页显示多少数据 10. 撕裂吧!邪魔外道与边缘学科。 10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader 10.2...

    Ext 开发指南 学习资料

    9.6. JsonView实现用户卡片拖拽与右键菜单 9.7. 下拉列表选择每页显示多少数据 10. 撕裂吧!邪魔外道与边缘学科。 10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader 10.1.4...

    EXT教程EXT用大量的实例演示Ext实例

    9.6. JsonView实现用户卡片拖拽与右键菜单 9.7. 下拉列表选择每页显示多少数据 10. 撕裂吧!邪魔外道与边缘学科。 10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader ...

    Ext Js权威指南(.zip.001

    8.3.6 为组件提供拖动功能:ext.util.componentdragger / 421 8.3.7 为组件实现动画功能:ext.util.animate / 422 8.3.8 其他的组件辅助功能类 / 423 8.4 组件的管理 / 423 8.4.1 组件管理及查询:ext....

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 mysql版本_spring3.0

    群发邮件,可以发html、纯文本格式,可以发给任意邮箱(实现批量发送广告邮件) 5. 群发or单独 发送短信,支持两种第三方短信商接口 6. spring aop 事物处理 7. 代码生成器 (freemarker), 代码 zip 压缩打包 8. MD5...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    群发邮件,可以发html、纯文本格式,可以发给任意邮箱(实现批量发送广告邮件) 5. 群发or单独 发送短信,支持两种第三方短信商接口 6. spring aop 事物处理 7. 代码生成器 (freemarker), 代码 zip 压缩打包 8. MD5...

    KODExplorer 芒果云-资源管理器

    - 拖动url——创建ext app - 文件管理,树目录变化后(增删改)自动同步到文件列表 - 文件管理,文件列表变化后(增删改)自动同步到树目录 - 中文用户名限制 - 对话框打开关闭动画 - 其他多处优化 ####fix ...

    ExtAspNet_v2.3.2_dll

    -Grid中TemplateField生成到页面中控件具有唯一ID,例如Grid1_ct5_Label2,Grid1_ct6_Label2(feedback:geruger)。 +2009-09-27 v2.1.2 -为Tree控件增加GetExpandAllNodesReference和...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -Grid中TemplateField生成到页面中控件具有唯一ID,例如Grid1_ct5_Label2,Grid1_ct6_Label2(feedback:geruger)。 +2009-09-27 v2.1.2 -为Tree控件增加GetExpandAllNodesReference和...

Global site tag (gtag.js) - Google Analytics