使用form表单上传文件(一)

今天在项目中要写一个上传文件的功能,使用jsp中的form表单的形式完成。


首先新建一个jsp,使用最原始的form表单来完成。


jsp中的代码如下,很简单:

<form method="post" action="<%=ermDomainUrl %>/erm/fodderUpload.do" enctype="multipart/form-data">
						上传: <input type="file" id="uploadInput" name="file">
						<input type="text" name="schoolRI" value="<%=schoolRI%>">
						<p>上传图片</p>
						<button type="submit">提交</button>
					</form>


因为是要上传文件,所以form表单中的enctype属性必须是  multipart/form-data

因为是post请求,所以method属性是post,, 

因为对应的servlet不在同一个项目中,故必须加上文根。


后台servlet中直接获取文件的代码如下:

1.首先servlet中的init函数中

@Override
	public void init() throws ServletException {
		//找到要存放的位置
		String WEBINFPath = this.getServletContext().getRealPath("WEB-INF");
		if(WEBINFPath==null){
			String temp = "";
			try {
				temp = this.getServletContext().getResource("/").getPath();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			WEBINFPath = temp + File.separator + "WEB-INF";
		}
		System.out.println(WEBINFPath);
		File webInfFile = new File(WEBINFPath);
		webRootPath = webInfFile.getParentFile().getParentFile().getParentFile().getAbsolutePath();
		cachePath = webRootPath+File.separator+"ims_res"+File.separator+"caches";
	}


使用init找到tomcat根目录以及想要上传到哪个文件夹下:

下面:


@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("大家好");
		
		try {
			request.setCharacterEncoding("utf-8");
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html; charset=utf8");
			PrintWriter out = response.getWriter();
			//下面使用流的方式解析request对象
//			InputStream stream = request.getInputStream();
//			InputStreamReader isr = new InputStreamReader(stream);
//			BufferedReader br = new BufferedReader(isr);
//			String str = br.readLine();
//			logger.info("str:"+str);
			
			//判断提交过来的表单是否为上传表单
			boolean flag = ServletFileUpload.isMultipartContent(request);
			if(flag){
				//构造一个文件上传处理对象
				DiskFileItemFactory factory = new DiskFileItemFactory();
				ServletFileUpload upload = new ServletFileUpload(factory);
				//定义一个迭代器
				Iterator items = null;
				//解析出表单中提交的文件内容
				items = upload.parseRequest(request).iterator();
				//创建一个map用来接收参数
				Map<String, String> mapParam = new HashMap<String, String>();
				while(items.hasNext()){//判断当前元素是否存在,并且指向下一个指针(即所谓的索引)
					FileItem item = (FileItem) items.next();
					//判断参数域是普通的表单输入域还是文件上传域,如果是表单输入域则返回true
					if(!item.isFormField()){
						String fileName = item.getName();
						if(!checkImage(fileName)){
							throw new Exception("该图片不是以.jpg或.png结尾的,请上传以.jpg或.png结尾的图片");
						}
						
						File cacheFile = new File(cachePath);
						String fodderUploadPath = cachePath+File.separator+"fodderUpload";
						if(cacheFile.exists()){
							File fodderUploafFile = new File(fodderUploadPath);
							if(!fodderUploafFile.exists()){
								FileUtil fu = new FileUtil();
								fu.createDir(fodderUploadPath);
							}
							
						}
						//构建一个文件上传的路径
						//先把该图片上传到tomcat 的ims_res\caches\fodderUpload 目录下
						File uploadFile = new File(fodderUploadPath+"\\"+fileName);
						//返回文件的大小,返回字节数
						Long fileLength = item.getSize();
						//上传文件
						item.write(uploadFile);
						out.println("文件名为fileName:"+fileName);
						out.println("文件大小fileLength:"+fileLength);
					}else{
//						String name = item.getFieldName();
//						String value = item.getString();
//						mapParam.put(name, value);
//						logger.info("name:"+name);
//						logger.info("value:"+value);
					}
				}
			}
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

重写 doPost方法可以获取上传的文件信息。

获取文件的部分我就不再写了。

这里值得一提的是,我要在前台往后台servlet中传参数的时候,即就是在form表单中:

<input type="text" name="schoolRI" value="<%=schoolRI%>">

后台使用常规的办法,可以使用 request.getParameter("schoolRI") 的方式获取参数,但是在这里不行,为什么呢?

原因是这里form表单中 enctype属性的值为:multipart/form-data 这样的话,后台servlet 就不能使用 request.getParameter("schoolRI")  获取参数了。

查了很多资料,这有一篇博客写的很好,引用一下,在这里也要感谢一下这个作者。 http://blog.csdn.net/jpiverson/article/details/12042205

援引文章中的话:

FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。

然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。

在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。

Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输 协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。

所以到最后 使用

在上述带啊中: FileItem item = (FileItem) items.next();

使用item对象即可得到


for(FileItem i: items)
    {
        i.getFieldName();    //参数名
        //i.getString();     //参数值(返回字符串),如果是上传文件,则为文件内容
     //i.get();           //参数值(返回字节数组),如果是上传文件,则为文件内容
     //i.getSize();     //参数值的字节大小     
//i.getName();     //上传文件的文件名      //i.getContentType(); //上传文件的内容类型      if(!i.isFormField()&&i.getSize()>0)   //简单参数返回true,文件返回false       Files.write(Paths.get("/upload/"+Paths.get(i.getName()).getFileName()), i.get());   }

上传附件的知识点写的很乱,在这里记录一下,也为以后我自己复习找到能复习的地方。


不积跬步,无以至千里

不积小流,无以成江海






  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值