`
酷的飞上天空
  • 浏览: 521806 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

简单文件上传

阅读更多

一个blog的上传功能当然是必不可少的,本例使用commons-fileupload-1.2.1实现

写了个接口如下,

public interface FileUpLoad {

	public int getFileSize(String fieldName);
	/**
	 * 取得上传文件的文件名
	 * @param fieldName
	 * @return
	 */
	public String getUpFileName(String fieldName);
	/**
	 * 取得普通字段的值
	 * @param name
	 * @return
	 */
	public String getValueOfParameter(String fieldName);
	/**
	 * 根据字段名称取得上传文件
	 * @param fieldName
	 * @return
	 */
	public File getFile(String fieldName);
	/**
	 * 如果此字段不属于文件上传,则返回null
	 * @param fieldName
	 * @return
	 */
	public String getFileType(String fieldName);
	/**
	 * 移动文件到targetFile,如果字段不是上传域则抛出RuntimeException。调用完成后源文件删除
	 * @param fieldName 上传域的字段
	 * @param targetFile 目标文件
	 */
	public void moveFile(String fieldName,File targetFile);
}

  

简单实现类如下

public class SimpleFileUpLoad implements FileUpLoad{

	private Map<String, String> mapOfString = new HashMap<String, String>();
	private Map<String, FileItem> mapOfFile = new HashMap<String, FileItem>();
	/**
	 * 
	 * @param tmpPath 临时文件位置
	 * @param maxSize 单个文件最大数,单位是KByte
	 * @param request  
	 * @throws FileUploadException 超过最大限制抛出
	 * @throws IOException 解析失败抛出
	 */
	@SuppressWarnings("unchecked")
	public SimpleFileUpLoad(String tmpPath,int maxSize,HttpServletRequest request) throws FileUploadException, IOException{
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置内存的最大数单位是bytes,超过了则存在硬盘上
		factory.setSizeThreshold(4096);
		//设置临时文件的目录
		factory.setRepository(new File(tmpPath));
		ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
		//设置单个文件的最大大小,单位是bytes
		servletFileUpload.setFileSizeMax(maxSize*1024);
		//设置编码方式,为了防止中文乱码
		servletFileUpload.setHeaderEncoding("UTF-8");
		List<FileItem> fileItems = servletFileUpload.parseRequest(request);
		Iterator<FileItem> it = fileItems.iterator();
		while(it.hasNext()){
			FileItem fileItem = it.next();
			if(fileItem.isFormField()){
				try {
					//取得非上传域的表单字段,存在放置表单字段的map里面,字段名为key
					mapOfString.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
				} catch (UnsupportedEncodingException e) {
					// UTF-8  why isn't a unCheckException?
				}
			}
			else{
				if(fileItem.getName()!=null && !fileItem.getName().equals("")){
					//将上传文件对应的FileItem对象,存在文件的map里面,字段名为key
					mapOfFile.put(fileItem.getFieldName(),fileItem);
				}
			}
		}
	}
	//获得文件按的尺寸,没用到,因为一直返回0,所以从使用上传后的文件对象中获得大小。
	@Override
	public int getFileSize(String fieldName) {
		if(!mapOfFile.containsKey(fieldName)) return 0;
		return (int)mapOfFile.get(fieldName).getSize();
	}
	//返回上传文件的文件名,截取后的文件名,非全路径
	@Override
	public String getUpFileName(String fieldName) {
		if(!mapOfFile.containsKey(fieldName)) return null;
		String fileName = mapOfFile.get(fieldName).getName();
		if(fileName.lastIndexOf("/")!=-1){
			//linux
			fileName = fileName.substring(fileName.lastIndexOf("/")+1);
		}else fileName = fileName.substring(fileName.lastIndexOf("\\")+1);//windos
		return fileName;
	}
	@Override
	public File getFile(String fieldName) {
		if(!mapOfFile.containsKey(fieldName)) return null;
		return new File(mapOfFile.get(fieldName).getName());
	}
	//返回上传文件的类型,不过没用到这个功能。
	@Override
	public String getFileType(String fieldName) {
		if(!mapOfFile.containsKey(fieldName)) return null;
		return mapOfFile.get(fieldName).getContentType();
	}
	@Override
	public String getValueOfParameter(String fieldName) {
		return mapOfString.get(fieldName);
	}
	@Override
	public void moveFile(String fieldName, File targetFile) {
		if(!mapOfFile.containsKey(fieldName)) throw new RuntimeException("上传文件不存在!");
		try {
			//写入新文件
			mapOfFile.get(fieldName).write(targetFile);
			//然后删除临时文件
			mapOfFile.get(fieldName).delete();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

 

使用的例子如下,以用于文件上传的servlet为例

public class DownFileServlet extends AbstractServlet {

	private static final long serialVersionUID = 1L;
	//get方法用于显示上传的文件
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		List<DownFile> downFileList = DaoFactory.getDownFileDao().getDownFileList();
		BindData(req, "downFileList", downFileList);
		forward("downfcontrol.jsp", req, resp);
	}
	//post方法用于处理上传文件的表单数据,完成后返回传页面
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String savePath = getServletContext().getRealPath("/down");
		DownFile df = new DownFile();
		FileUpLoad FileUpLoad=null;
		String upFileName;
		String saveName;
		try {
			//设置上传文件最大10M
			FileUpLoad = new SimpleFileUpLoad(getTmp(), 10*1024, req);
		} catch (FileUploadException e) {
			BindData(req, "errorMsg", "上传文件失败!e:"+e.toString());
			forwardResultPage(req, resp);
			return;
		}
		
		upFileName = FileUpLoad.getUpFileName("upfile");
		if(upFileName==null){
			BindData(req, "errorMsg", "上传文件失败!上传文件不存在");
			forwardResultPage(req, resp);
			return;			
		}
		//保存的实际文件名为当前时间的字符串形式,加上源文件的最后一个后缀名。如无后缀则只是时间按作为文件名
		saveName = Calendar.getInstance().getTimeInMillis()+"";
		if(upFileName.lastIndexOf(".")!=-1)
			saveName = saveName+upFileName.substring(upFileName.lastIndexOf("."));
		File saveFile = new File(savePath,saveName);
		//将临时文件拷贝到保存目录
		FileUpLoad.moveFile("upfile", saveFile);
		
		df.setDownFileName(upFileName);
		df.setDownFilePath(saveName);
		df.setDownFileSize((int)saveFile.length()/1024+1);
		
		DaoFactory.getDownFileDao().addDownFile(df);
		sendRedirect("admin/downfcontrol.htm", req, resp);
	}

}

 

 

很简单,不再介绍,jsp文件也不再贴出

分享到:
评论

相关推荐

    超简单文件上传,只是一个控件

    "超简单文件上传,只是一个控件"这个标题暗示我们将讨论一个简易的ASP.NET文件上传解决方案,它主要依赖于内置的FileUpload控件。C#是ASP.NET的主要编程语言,因此我们将深入探讨如何使用C#来处理文件上传。 文件...

    阿里云存储简易文件上传系统 v1.1 子目录版

    阿里云存储简易文件上传系统 SWFUPLOAD v1.1 根目录版基于S3上传版本改来的。 阿里云存储简易文件上传系统1.1 更新 增加了底部显示客户的IP,提示勿上传非法文件 阿里云SDK更新至最新版本 根目录和子目录分开 ...

    java简单文件上传

    标题"java简单文件上传"暗示我们将关注如何使用Java Servlet来接收和处理上传的文件。以下是一个基本的步骤概述: 1. **创建HTML表单**:在前端,创建一个包含`&lt;input type="file"&gt;`的表单,用户可以选取要上传的...

    基于servlet的简易文件上传(带进度条)

    在提供的`MyUploadFile`压缩包中,可能包含了这个简易文件上传系统的具体实现,包括HTML表单、JavaScript的进度条逻辑以及Servlet的完整代码。解压后仔细查看,你将能更好地理解整个过程的实现细节。

    Silverlight 简单文件上传

    本主题聚焦于"Silverlight简单文件上传",这是一个常见的功能需求,尤其在图片分享、内容管理系统或者社交媒体平台中。在Silverlight中实现文件上传,可以帮助用户方便地将本地文件,尤其是图片,上传到服务器。 ...

    php简单文件上传源代码

    本资源“php简单文件上传源代码”是专为初学者设计的,旨在帮助他们理解和实现这一功能。下面我们将深入探讨这个话题,了解如何在PHP中执行文件上传。 首先,我们需要一个HTML表单来让用户选择他们想要上传的文件。...

    Delphi基于Indy Ics的简单文件上传实例

    本示例将详细介绍如何使用Indy组件集(Indy Internet Components)中的ICS(Internet Connection Suite)来实现一个简单的文件上传功能,特别是针对大于2GB的大文件上传场景。 Indy是一个广泛使用的开源组件库,...

    简单文件上传,用到数据库

    本项目“简单文件上传,用到数据库”提供了一个基础的实现方案,非常适合初学者学习。它将文件上传与数据库操作相结合,使得上传的文件信息能够被持久化存储,便于后续的查询和管理。 首先,我们要理解文件上传的...

    自己做的简单文件上传下载签收系统

    总的来说,这个"简单文件上传下载签收系统"是一个涵盖了前端交互、后端处理、数据库管理和安全策略的综合性项目。它有效地解决了文件共享和协作中的关键问题,为用户提供了一个可靠且便捷的平台。

    Nginx+upload+lua实现简单文件上传服务

    本教程将详细解析如何使用Nginx、upload模块以及lua来搭建一个简单的文件上传系统。 首先,我们需要了解Nginx的ngx_http_upload_module模块,这是一个用于处理HTTP POST请求中的文件上传的第三方模块。它允许我们在...

    阿里云存储简易文件上传系统php版v1.1根目录版

    阿里云存储简易文件上传系统 SWFUPLOAD v1.1 根目录版基于S3上传版本改来的。 阿里云存储简易文件上传系统1.1 更新 增加了底部显示客户的IP,提示勿上传非法文件 阿里云SDK更新至最新版本 根目录和子目录分开 下载URL...

    PHP简易文件上传系统 For 阿里云存储

    云存储PHP简易文件上传系统 v1.3 For 阿里云存储 简单的上传和下载 适合个人和小企业分享文件 适合一些资源论坛 增加独立上传站点 作为附件使用 因为使用的云存储,文件基本不存在丢失的情况 使用说明: 使用...

    struts1.2 简单文件上传例子

    通过这个简单的Struts1.2文件上传示例,我们可以学习到如何在Java Web环境中处理文件上传,理解MVC框架如何与外部库协同工作,以及如何在实际应用中确保文件上传的安全性。这对于任何想要深入理解Struts1.2或者进行...

    PHP简易文件上传系统 For 阿里云存储 v1.3.zip

    云存储PHP简易文件上传系统 v1.3 For 阿里云存储 简单的上传和下载 适合个人和小企业分享文件 适合一些资源论坛 增加独立上传站点 作为附件使用 因为使用的云存储,文件基本不存在丢失的情况 使用说明: 使用...

    简单的PHP文件上传源码

    总之,这个简单的PHP文件上传源码是一个很好的学习起点,它涵盖了文件上传的基本流程,对于初学者来说,通过阅读和理解源码中的注释,可以快速掌握PHP文件上传的核心知识。同时,随着技能的提升,还可以逐步学习更...

    基于Python+Django简单实现文件上传下载功能源码.zip

    基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于Python+Django简单实现文件上传下载功能源码 基于...

    一个简单的文件上传管理功能

    一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的文件上传管理功能 一个简单的...

    java web strut框架 简单文件上传.rar

    在这个"java web strut框架 简单文件上传"的示例中,我们将深入探讨如何在Struts框架下实现文件上传功能。 首先,我们需要理解文件上传的基本原理。在HTTP协议中,文件上传通常涉及到表单提交,尤其是当`enctype`...

    基于PHP的阿里云存储简易文件上传系统 php版 v1.1 根目录版.zip

    【标题】"基于PHP的阿里云存储简易文件上传系统 php版 v1.1 根目录版.zip" 提供了一个使用PHP实现的轻量级文件上传解决方案,它与阿里云存储服务相结合,允许用户便捷地将文件上传到阿里云的对象存储服务(OSS)。...

Global site tag (gtag.js) - Google Analytics