struts2上传文件(一) 表单设置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/garry1861/article/details/50932902

(本文章由作者自己所写,所有版权归作者所有,如要转载请将本blog地址附上)        

此文章写好了久了,今天找出来了,再发表一下。

        就上传文件来说呢,以前我也遇到很多问题,最近我把上传文件的问题总结了一下,写出来给大家看看,希望能对大家有一定的帮助.

        首先我们来看一下表单,我们在提交数据的时候,一般情况只要写action和method属性。enctype这个属性我们一般情况不会来设置,他默认的设置是application/x-www-form-urlencoded这个值。我们来了解一下enctype是干什么的。enctype是表单数据的编码方式,他有三个值,
1:application/x-www-form-urlencoded 这是默认编码方式,只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2:multipart/form-data    这种编码方式会以二进制流的方式来处理表单的数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3:text/plain 这种编码方式当表单的action属性为的形式的时候比较方便,这种方式主要用于直接通过表单发送邮件。

        我们用一个简单的例子来看一下表单enctype属性值为application/x-www-form-urlencoded和multipart/form-data时的差别。

HTML代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传文件 enctype=application/x-www-form-urlencoded</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

</head>

<body>
<!-- 表单enctype属性值为application/x-www-form-urlencoded -->
<form id="form1" name="form1" action="form1.jsp" method="post" enctype="application/x-www-form-urlencoded">
上传文件:<input type="file" name="file1"/> <br>
请求参数:<input type="text" name="canshu"/> <br>
<input type="submit" name="ceshi" value="表单提交">
</form>
</body>
</html>

form1.jsp代码

<%@ page language="java" import="java.io.*" pageEncoding="utf-8"%>
<% 
//得到http请求的数据流
InputStream input = request.getInputStream();
//用我们刚获得的http流建立一个BufferedReader对象
BufferedReader buff = new BufferedReader(new InputStreamReader(input));

//读取http数据流的内容
String msg = "";
while((msg = buff.readLine())!=null){
out.println(msg+"<br>");
}
%>

上面的jsp处理页面是通过二进制流来处理HTTP请求, 这是一种更底层的处理方式,我们在用HttpServletRequest的getParameter方法来获得参数的时候,实际上是WEB服务器帮我们处理了底层的二进制流 .下面两个页面是我的例子图片,


这个图片是上传前的HTML文件,上传文件是"E:\新建 文本文档.txt" 文本里的内容是"表单提交",好,现在我们点一下提交按钮


file1=E%3A%5C%E6%96%B0%E5%BB%BA+%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt&canshu=%E8%A1%A8%E5%8D%95%E6%8F%90%E4%BA%A4&ceshi=%E8%A1%A8%E5%8D%95%E6%8F%90%E4%BA%A4

这些内容是html页面提交到form1.jsp页面里的内容。

在这里我们看一下第一个问题,就是参数问题,看一下,我们这里面有三个参数,第一个是我们上传的文件参数file1 第二个输入文本框canshu,第三个按钮ceshi,和我们平时传参数一样。参数正常了,我们再来看下这些乱钱八糟的代码。这些代码是干什么用的?在java类里有两个专门来处理这种字符的类。URLEncoder   and URLDecoder这两个类,然后我们修改一下我们的那个form1.jsp页面,在while循环里加一句 out.println(URLDecoder.decode(msg,"utf-8"));我这里用的编码是utf-8,如果你们用的是GBK,就改成GBK就可以。
刚才我们是用流的方式得到的数据,我们也可以以正常的方式得到,HttpServletRequest的getParameter方法,我们来修改一下form1.jsp页面,把form1.jsp里的代码换成,

request.setCharacterEncoding("utf-8");
out.println(request.getParameter("file1"));
out.println(request.getParameter("canshu"));

当form表单的enctype属性值为application/x-www-form-urlencoded时,我们只能获得到参数名,并得不到里面的内容。所以说,用这个方式我们实现不了上传。我们再用multipart/form-data这个属性值试一下,看看能得到什么。
我在网上随便找了一条新闻写入到刚才准备要上传的那文本文件里。然后我们把表单的属性值改一下,点击提交安钮。这时,是不是就把文本里的内容都读了出来。我们注意的是一但我们把表单的enctype属性值改成mutipart/form-data就无法用HttpServletRequest的getParameter方法来获得参数。

展开阅读全文

没有更多推荐了,返回首页