javaweb文件的下载和上传功能的实现

没有文件上传的普通form表单上传

<form action="xxxx" method="post">
    <input type="text" name="fname" /></p>
    <input type="text" name="lname" /></p>
    <input type="submit" value="Submit" />
</form>

上传的数值可以在servlet中获取得到

String s_bPublishDate=request.getParameter("fname");
String s_aPublishDate=request.getParameter("lname");

这样就可以在后台得到Input框中输入的数值呢


文件上传和普通的表单上传有什么不一样呢?

<form action="NewsServlet?action=save" method="post" enctype="multipart/form-data">
    <input type="text" name="title">
    <input type="text" name="title">
    <input type="text" name="title">
    <input type="text" name="title">
    。。。。。。。。。。。。。。。。。。
    <input type="file" name="file">
    <input type="submit" value="提交">
</form>

注意在这个有文件提交的form表单中,form中多了 enctype="multipart/form-data"

<head>下面添加代码<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

表单标签中设置enctype=”multipart/form-data”来确保匿名上载文件的正确编码。

表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.

这个时候,我们input中的内容(所有不论文件还是什么)都变成了二进制格式传递过去了所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:

FileItemFactory factory=new DiskFileItemFactory();
//FileItemFactory 一个工厂接口,用于创建FileLtem的实例
//DiskFileItemFactory 这实现创建FileLtem的实例保持其内容可以在内存较小的项目,
或者磁盘上的临时文件较大的项目。
ServletFileUpload upload=new ServletFileUpload(factory);
//数据如何个别零件储存是由厂用于创建;一个给定的一部分可能是内存,磁盘,或其他地方。构造该类的一个实例,使用提供的fileitem厂创建实例。
List<FileItem> items=null;便利一个List链表准备接受全部的数据
try {
	items=upload.parseRequest(request);
    } catch (Exception e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
Iterator itr=items.iterator();
//遍历上传的内容,迭代器

while(itr.hasNext()){
//如果迭代器里面还有内容,返回true,返回迭代的下一个元素。并把迭代输出的结果强制转换成Car对象。
	FileItem item=(FileItem) itr.next();获得这个元素,然后先后面走。
	if(item.isFormField()){
	//如果是普通表单,不是文件表单。
		String fieldName=item.getFieldName();
		//得到数据的name,就是input中name的名字。
		if("newsId".equals(fieldName)){
		//你要的数据和name比较,看是不是你要的数据。
			if(StringUtil.isNotEmpty(item.getString("utf-8"))){
			//如果不为空的话。获取item中的值,且转化成了utf-8格式。
				news.setNewsId(Integer.parseInt(item.getString("utf-8")));
			}
		}
		if("title".equals(fieldName)){
			news.setTitle(item.getString("utf-8"));
		}
		if("isUserful".equals(fieldName)){
			news.setIsUserful(Integer.parseInt(item.getString("utf-8")));
		}
		if("content".equals(fieldName)){
			news.setContent(item.getString("utf-8"));
		}
		if("author".equals(fieldName)){
			news.setAuthor(item.getString("utf-8"));
		}
		if("typeId".equals(fieldName)){
			news.setTypeId(Integer.parseInt(item.getString("utf-8")));
		}
		if("isHead".equals(fieldName)){
			news.setIsHead(Integer.parseInt(item.getString("utf-8")));
		}
		if("isImage".equals(fieldName)){
			news.setIsImage(Integer.parseInt(item.getString("utf-8")));
		}
		if("isHot".equals(fieldName)){
			news.setIsHot(Integer.parseInt(item.getString("utf-8")));
		}
		if("imageName".equals(fieldName)&&news.getImageName()==null){
			if(StringUtil.isNotEmpty(item.getString("utf-8"))){
				news.setImageName(item.getString("utf-8").split("/")[1]);
				//split("/")[1]不要后面的尾椎,eg  .doc
			} 
		}
	}else if(!"".equals(item.getName())){
	        //如果为文件表单
		try {
			String imageName=DateUtil.getCurrentDateStr()+item.getName();
			//这里是我自己给文件取得一个名字。
			news.setImageName(DateUtil.getCurrentDateStr()+item.getName());
			String filePath=PropertiesUtil.getValue("filePath")+imageName;
			//把文件写到那个地方,上传的路径,你懂的。
			item.write(new File(filePath));
			//把文件写进去就ok了。
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


一个附带上传文件大小限制的上传文件

http://www.cnblogs.com/xdp-gacl/p/4200090.html

你可能感兴趣的:(javaweb文件的下载和上传功能的实现)