`
uule
  • 浏览: 6358536 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

上传组件 (自定义异常展示信息) UploadFileService

 
阅读更多

注意自定义异常的使用及方法的抽取。

try {
	
} catch (Exception e) {
	e.printStackTrace();
	logger.error("generate error : " + e.getMessage());
	throw new ConvertsServiceException(e.getMessage());
}

 

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;


@Service("iUploadFileService")
public class UploadFileService implements IUploadFileService {

	private static final Logger logger = LoggerFactory.getLogger(UploadFileService.class);
	
	@Autowired
	private IEsbFileDao esbFileDao;
	
	@Autowired
	private ISysFileDao sysFileDao;
	
	@Override
	public EsbFile saveFile(MultipartFile file, String[] allowExtName,
			long maxLength, String module) throws UploadFileException {
		logger.debug("saveFile begin...");
		
		// 校验文件
		validateFile(file, allowExtName, maxLength);
		
		logger.debug("validateFile pass...");
		
		// 获取时间戳
		String time = System.currentTimeMillis() + "";
		
		// 拼装服务端文件存储路径
		String ext = FilenameUtils.getExtension(file.getOriginalFilename());
		ext = "".equals(ext) ? "" : ("." + ext);
		String path = new StringBuilder(
				SystemConfiguration.getConfigByName(Constants.SYSTEM_FILE_PATH))
				.append(File.separator).append(time).append(File.separator)
				.append(time).append(ext).toString();
		
		logger.debug("savedFilePath : " + path);
		
		// 保存文件
		File savedFile = new File(path);
		try {
			FileUtils.writeByteArrayToFile(savedFile, file.getBytes());
		} catch (IOException e) {
			// 保存文件出错
			throw new UploadFileException(
					"\u4fdd\u5b58\u6587\u4ef6\u51fa\u9519");
		}
		
		logger.debug("writeByteArrayToFile pass...");
		
		// 将文件信息存储到数据中
		// sysfile
		SysFile sf = new SysFile();
		sf.setOriFileName(file.getOriginalFilename());
		sf.setServerAbsPath(path);
		sf.setFileSize(file.getSize());
		try {
			sf.setMd5CheckSum(MD5Util.getMD5(savedFile));
		} catch (Exception e) {
			logger.error("MD5_CHECK_SUM error...");
			e.printStackTrace();
		}
		ObjectUtil.setCreatedBy(sf);
		sf = sysFileDao.save(sf);
		
		// esbfile
		EsbFile ef = new EsbFile();
		ef.setModuleCode(module);
		ef.setFileId(sf.getId());
		ef.setSysFile(sf);
		ObjectUtil.setCreatedBy(ef);
		esbFileDao.save(ef);
		
		logger.debug("saveFile end...");
		
		return ef;
	}

	/**
	 * 验证上传文件是否合法,否则抛出异常
	 * 
	 * @param file
	 * @param allowExtName null或空数组则允许所有文件
	 * @param maxLength 为负数则允许上传任意大小文件
	 * @throws UploadFileException
	 */
	private void validateFile(MultipartFile file, String[] allowExtName,
			long maxLength) throws UploadFileException {
		String fileName = "";
		long fileSize = 0L;
		// 验证文件为空
		if (file == null || (fileName = file.getOriginalFilename()).equals("")
				|| (fileSize = file.getSize()) <= 0) {
			// 上传文件为空
			throw new UploadFileException(
					"\u4e0a\u4f20\u6587\u4ef6\u4e3a\u7a7a");
		}
		// 验证文件大小
		if (maxLength > 0 && fileSize > maxLength) {
			// 上传文件大小超出上限
			throw new UploadFileException(
					"\u4e0a\u4f20\u6587\u4ef6\u5927\u5c0f\u8d85\u51fa\u4e0a\u9650 ["
							+ maxLength + "byte]");
		}
		if (allowExtName != null && allowExtName.length > 0) {
			if (Arrays.binarySearch(allowExtName, FilenameUtils.getExtension(fileName).toLowerCase()) < 0) {
				// 上传文件格式不符合要求
				throw new UploadFileException(
						"\u4e0a\u4f20\u6587\u4ef6\u683c\u5f0f\u4e0d\u7b26\u5408\u8981\u6c42 "
								+ Arrays.toString(allowExtName));
			}

		}
	}

}

 

public class UploadFileException extends Exception {

	private static final long serialVersionUID = -7352737478882318028L;
	
	public UploadFileException() {
		super();
	}

	public UploadFileException(String message, Throwable cause) {
		super(message, cause);
	}

	public UploadFileException(String message) {
		super(message);
	}

	public UploadFileException(Throwable cause) {
		super(cause);
	}

}

 

调用:

@RequestMapping(value="/esbService/uploadTemplet.do", method = RequestMethod.POST)
	@ResponseBody
	public void uploadTemplet(@RequestParam MultipartFile file, HttpSession session, HttpServletResponse response){		
		// 返回值
		Map<String, Object> result = new HashMap<String, Object>(2);
		
		EsbFile esbfile = null;
		// 上传文件保存
		try {
			esbfile = upFileDS.saveFile(file, new String[]{"doc", "docx", "zip"}, -1, "SRV_DEFINE.IMPORT_DOC");
		} catch (UploadFileException e) {
			result.put("code", 1);
			result.put("msg", e.getMessage());
			writeResponse(response,result);
			return;
		}
		
		// 导入规范
		try {
			convertsSrvDS.importWord(esbfile);
		} catch (Exception e) {
			result.put("code", 1);
			result.put("msg", e.getMessage());
			writeResponse(response,result);
			return;
		}
		result.put("code", 0);
		writeResponse(response,result);
	}

     private void writeResponse(HttpServletResponse response, Map<String, Object> result) {
		try {
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write(JSON.toJson(result));
			response.getWriter().flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

 

以前代码:

 

public class TempletUploadUtil {

	private static final Logger logger = LoggerFactory.getLogger(TempletUploadUtil.class);
	
	public static Map<String, Object> uploadTemplet(@RequestParam MultipartFile file, HttpSession session, 
			HttpServletResponse response,SysConfig env) {

		Map<String, Object> result = new HashMap<String, Object>(2);

		String newName = null;
		try {
			if (!file.isEmpty()) {
				if (env == null || "".equals(env)) {
					result.put("code", 1);
					result.put("msg", "获取上传路径配置失败");
					writeResponse(response, result);
					return null;
				}
				// 时间戳为文件名保存文件
				int index = file.getOriginalFilename().lastIndexOf(".");
				
				if(index>-1){
					newName = env.getConfigValue().trim() + File.separator + System.currentTimeMillis()+ File.separator  + file.getOriginalFilename();
				}else{
					newName = env.getConfigValue().trim() + File.separator + String.valueOf(System.currentTimeMillis());
				}
				
				if(!isAllowedFileType(newName)){
					result.put("code", 3);
					result.put("msg", "文件类型不允许!");
					writeResponse(response,result);
					return null;
				}
				// newName = file.getName()+"_"+newName;
				// 写文件
				FileUtils.writeByteArrayToFile(new File(newName), file.getBytes());
				String loc = new File(newName).getAbsolutePath();
				result.put("code", 0);
				result.put("msg", loc);
			}
		} catch (IOException e) {
			logger.error("文件上传失败:", e);
			result.put("code", 2);
			result.put("msg", "文件上传失败!");
			writeResponse(response, result);
			return null;
		}
		return result;
	}
	
	private static void writeResponse(HttpServletResponse response, Map<String, Object> result) {
		try {
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write(JSON.toJson(result));
			response.getWriter().flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private static Boolean isAllowedFileType(String newName){
		String ext = newName.substring(newName.lastIndexOf(".")+1);
		String allowType = "wsdl,zip,rar";
		return allowType.indexOf(ext.toLowerCase()) >= 0;  
	}

}

 

 

 

 

 

分享到:
评论

相关推荐

    自定义异常

    如果这个组件支持异常处理,那么开发者可能会在自定义异常上下文中使用它,例如,当用户在界面上输入无效数据时抛出自定义异常。 总结来说,自定义异常是软件开发中的重要实践,它允许我们定制错误处理策略,使代码...

    鸿蒙+自定义组件+实例代码

    鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例鸿蒙自定义组件实例...

    将Vue组件包装为Web组件自定义元素

    接下来,我们将深入探讨如何将Vue组件包装为Web组件自定义元素。 首先,我们需要理解Vue组件和Web组件的基本概念。Vue组件是Vue.js的核心特性之一,它允许我们通过定义不同的模块来拆分复杂的用户界面,每个模块都...

    vue-web-component-wrapper:将Vue组件包装为Web组件自定义元素

    @ vue / web-component-wrapper 包装并将Vue组件注册为自定义元素。兼容性。 不支持IE11及以下版本。 如果定位本机支持ES2015但不支持本机Web组件的浏览器: 您还将需要 。 有关和支持,请访问caniuse.com。 使用...

    uni-app 自定义组件展示html富文本内容,可实现富文本html内容中 图片展示、视频播放、音频播放。

    1. 图片展示:自定义组件可以通过接收JSON中的图片信息,使用uni-app的组件来显示图片,同时处理图片的点击事件、懒加载等功能。 2. 视频播放:对于视频,可以使用uni-app的组件来播放。自定义组件需要解析JSON中的...

    Qt美化界面、美化组件、自定义组件源码

    "Qt美化界面、美化组件、自定义组件源码"这个主题涵盖了提升Qt应用视觉效果和功能定制的核心知识点。Qt库提供了丰富的功能,允许开发者创建出优雅且高效的应用程序,而不仅仅是基本的用户界面。 首先,Qt美化界面...

    业务异常提示处理 springboot+Assert(自定义断言)

    6. **公共异常类**:为了规范化异常信息,通常会定义一个或多个公共异常类,比如`BusinessException`,它包含业务错误码和错误信息,这使得在抛出和捕获异常时能提供一致的信息,提高了代码的可读性。 7. **模块化...

    C#的自定义组件和自定义控件

    同时,`testForm`是一个示例程序,展示了如何在实际应用中实例化并使用这些自定义控件,对于理解和学习这些组件的功能及用法非常有帮助。 通过深入理解并实践这些自定义组件和控件的代码,开发者不仅可以掌握C# UI...

    office2016 组件自定义安装辅助工具

    Office 2016 Install 不仅是一款在线 Office 2016 下载安装工具,还可以用于 Office 2016 离线安装包的组件自定义安装,如果你只想安装 Word/Excel/PowerPoint 或者只想安装其中一款软件,Office 2016 Install 就是...

    Vue-Vben-Admin - 自定义上传excel文件弹框组件

    在本案例中,我们关注的是一个自定义的上传Excel文件的弹框组件。这个组件允许用户选择并上传Excel文件,以便进行数据导入或其他需要处理Excel数据的操作。 在 Vue.js 中,组件是构建应用程序的基本单元,它们可以...

    各种Flex自定义组件

    在Flex中,自定义组件是开发人员为了满足特定需求而创建的特殊用户界面元素。这些组件可以扩展标准的Flex组件库,或者从头开始构建,以提供独特的功能和视觉表现。 在标题“各种Flex自定义组件”中,我们可以推断这...

    android 自定义组件

    在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术。自定义组件允许开发者根据需求扩展Android系统原生组件的功能,或者创建全新的组件样式,从而实现个性化界面和交互效果。下面将详细介绍Android...

    源码剖析Springboot自定义异常.docx

    在Spring Boot应用中,自定义异常处理是一种常见的做法,它允许开发者对应用程序可能出现的异常进行统一管理和返回定制化的响应。本文将深入剖析Spring Boot如何处理自定义异常。 首先,我们来看一个简单的自定义...

    flex 高级自定义组件

    Flex中的高级自定义组件开发是构建复杂用户界面的关键技术,它允许开发者超越基本组件的限制,以满足特定的业务需求和视觉设计。在创建高级组件时,了解并掌握一些核心方法的重写至关重要,这些方法涉及到组件的生命...

    【OpenHarmony】 ArkTS 语法基础 ② ( ArkTS 自定义组件 )

    【OpenHarmony】ArkTS 语法基础 ② ( ArkTS 自定义组件 | 自定义可导入组件 - export 声明模块 | 导入自定义组件 - import 导入组件 ) https://hanshuliang.blog.csdn.net/article/details/139407374 博客源码快照 ...

    uniapp使用抖音微信自定义组件-uniapp如何用抖音的组件

    ### uni-app 使用抖音微信自定义组件详解 #### 一、引言 随着移动互联网的发展,跨平台应用开发框架越来越受到开发者的青睐。其中,uni-app作为一款使用Vue.js语法进行多端开发的前端框架,凭借其高效、易用的特点...

    Android 自定义TimePicker组件

    本文将深入解析TimePicker组件,并介绍如何进行自定义,以满足更加个性化的应用需求。 首先,我们来了解TimePicker的基本用法。在Android SDK中,TimePicker分为两种模式:数字时钟(digital)和模拟时钟(analog)...

    Flex4自定义组件开发.pdf

    ### Flex4自定义组件开发详解 #### 一、Flex4自定义组件概述 Flex4(也称为Spark)是Adobe Flex框架的一个重要版本,它引入了许多新的特性,包括改进的组件库、性能优化以及更好的可定制性。在Flex4中,自定义组件...

    页面布局和自定义分页展示

    本篇文章将深入探讨如何利用Bootstrap来实现高效、美观的页面布局以及自定义分页展示。 首先,我们来看页面布局。Bootstrap采用了网格系统(Grid System),它通过一系列行(row)和列(column)来帮助设计师和...

    tapestry5 自定义组件

    在 Tapestry 5 框架中,自定义组件是扩展其功能的关键方式,它允许开发者根据特定需求创建个性化和可重用的 UI 元素。Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型...

Global site tag (gtag.js) - Google Analytics