自己写一个上传的文件.docx
- 文档编号:18432094
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:17
- 大小:32.36KB
自己写一个上传的文件.docx
《自己写一个上传的文件.docx》由会员分享,可在线阅读,更多相关《自己写一个上传的文件.docx(17页珍藏版)》请在冰点文库上搜索。
自己写一个上传的文件
就上传文件来说呢,以前我也遇到很多问题,最近我把上传文件的问题总结了一下,写出来给大家看看,希望能对大家有一定的帮助.
首先我们来看一下表单,我们在提交数据的时候,一般情况只要写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属性为mailto:
url的形式的时候比较方便,这种方式主要用于直接通过表单发送邮件。
我们用一个简单的例子来看一下表单enctype属性值为application/x-www-form-urlencoded和multipart/form-data时的差别。
HTML代码
DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01Transitional//EN”>
–
–表单enctype属性值为application/x-www-form-urlencoded–>
上传文件:
请求参数:
form1.jsp代码
<%@pagelanguage=”java”import=”java.io.*”pageEncoding=”utf-8″%>
<%
//得到http请求的数据流
InputStreaminput=request.getInputStream();
//用我们刚获得的http流建立一个BufferedReader对象
BufferedReaderbuff=newBufferedReader(newInputStreamReader(input));
//读取http数据流的内容
Stringmsg=“”;
while((msg=buff.readLine())!
=null){
out.println(msg+”
”);
}
%>
上面的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类里有两个专门来处理这种字符的类。
URLEncoderandURLDecoder这两个类,然后我们修改一下我们的那个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方法来获得参数。
自己写一个上传的文件
HTML代码
DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01Transitional//EN”>
–
–表单enctype属性值为application/x-www-form-urlencoded–>
上传文件:
请求参数:
JSP代码upload.jsp
<%@pagelanguage=”java”pageEncoding=”utf-8″%>
<%@pageimport=”java.io.InputStream”%>
<%@pageimport=”java.io.BufferedReader”%>
<%@pageimport=”java.io.InputStreamReader”%>
<%@pageimport=”java.io.File”%>
<%@pageimport=”java.io.PrintStream”%>
<%@pageimport=”java.io.FileOutputStream”%>
<%
//得到httpServletRequest的InputStream流
InputStreaminput=request.getInputStream();
//获得一个BufferedReader对象
BufferedReaderbr=newBufferedReader(newInputStreamReader(input));
Stringbuffer=“”;
//循环读出请求内容的每一行
while((buffer=br.readLine())!
=null){
//如果读到内容以—————————–开始,并以–结束,表明已经到请求内容尾
if(buffer.endsWith(“–”)&&buffer.startsWith(“—————————–”))
break;//退出
//如果读到的内容以—————————–开始,表明开始了一个表单域
if(buffer.startsWith(“—————————–”)){
//如果下一行中有filename字符窜,表明这是一个文件域
if(br.readLine().indexOf(“filename”)>1){
//跳过两行,因为是从两行后,才开始正文的
br.readLine();
br.readLine();
Filefile=newFile(request.getRealPath(“/”)+System.currentTimeMillis()+”.txt”);
//创建一个文件输出流
PrintStreamps=newPrintStream(newFileOutputStream(file));
Stringcontent=null;
//读取文件内容
while((content=br.readLine())!
=null){
//如果读取的内容以—————————–开始,表明开始了下一个表单内容;
if(content.startsWith(“—————————–”))
break;
//将读者到的内容输出到文件中
ps.println(content);
}
ps.flush();
ps.close();
}
}
}
br.close();
%>
这个时候我们可以打开我们的服务器根目录,看一下,我们上传的文件。
在表单的enctype属性值为multipart/form-data的时候,file的值,页面读出来的是文件内容;而当值为application/x-www-form-urlencoded 页面读出来的是文本框里的内容。
通过上面的例子,我们了解到了文件是如何被上传的。
那下面我们来看一下,通过框架来实现上传功能。
我们这里用框架上传呢,只介绍一种,就是apache组织下的,Common-FileUpload项目,在用这个项目之前,还要使用另一个项目commons-io-版本号.jar这个项目,这两个项目我们都下载下来后,会得到这两个包,这是我下载的版本:
commons-fileupload-1.2.1.jar和commons-io-1.4.jar这两个包,我们把这两个包都放到我们项目下的lib文件夹下。
如果不用commons-io这个项目,会有空指针异常。
我们开始编写基于这两个开源项目的上传文件下面是代码:
<%@pagelanguage=”java”pageEncoding=”utf-8″%>
<%@pageimport=”java.io.File”%>
<%@pageimport=”mons.fileupload.disk.DiskFileItemFactory”%>
<%@pageimport=”mons.fileupload.servlet.ServletFileUpload”%>
<%@pageimport=”mons.fileupload.FileItem”%>
<%@pageimport=”java.io.FileOutputStream”%>
<%@pageimport=”java.io.InputStream”%>
<%@pageimport=”java.util.List”%>
<%@pageimport=”java.util.Iterator”%>
<%
//声名一个工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//设置上传工厂限制大小
factory.setSizeThreshold(1024*1024*10);//1024*1024是一M也就上限制上传文件大小为10M
factory.setRepository(newFile(request.getRealPath(“/”)));
//创建一个上传文件的ServletFileUpload对象
ServletFileUploadupload=newServletFileUpload(factory);
//设置最大上传限制
upload.setSizeMax(1024*1024*20);
//处理HTTP请求,items是所的有表单项
Listitems=upload.parseRequest(request);
//遍历所有的表单项
for(Iteratorit=items.iterator();it.hasNext();)
{
FileItemitem=(FileItem)it.next();
//判断是不是上传文件,如果不是上传文件就显示出表单域的名字和值
//如果是上传文件,就上传此文件
if(item.isFormField()){
Stringname=item.getFieldName();
Stringvalue=item.getString(“utf-8″);
out.println(“表单域的name=value对应为:
”+name+”=”+value);
}
else{
//取得文件域的表单域名
StringfieldName=item.getFieldName();
//取得文件名
StringfileName=item.getName();
//取得文件类型
StringcontentType=item.getContentType();
//以当前时间来生成上传文件名的文件名
FileOutputStreamfos=newFileOutputStream(request.getRealPath(“/”)+System.currentTimeMillis()+fileName.substring(fileName.lastIndexOf(“.”),fileName.length()));
//如果上传文件域对应文件的内容已经在内存中
if(item.isInMemory()){
fos.write(item.get());
}
//如果文件内容不完全在内存中
else{
//获取上传文件内容的输入流
InputStreamis=item.getInputStream();
byte[]buffer=newbyte[1024];
intlen;
//读取上传文件的内容,并将其写入上传文件的内容中。
while((len=is.read(buffer))>0){
fos.write(buffer,0,len);
}
is.close();
fos.close();
}
}
}
%>
第二种方法上传:
我们要到
cosupload.jsp
<%@pagelanguage=”java”pageEncoding=”utf-8″%>
<%@pageimport=”com.oreilly.servlet.multipart.MultipartParser”%>
<%@pageimport=”com.oreilly.servlet.multipart.Part”%>
<%@pageimport=”com.oreilly.servlet.multipart.ParamPart”%>
<%@pageimport=”com.oreilly.servlet.multipart.FilePart”%>
<%@pageimport=”java.io.File”%>
<%
//设置POST请求的内容最大字节数为10M,该类用于解析HTTP请求
MultipartParsermp=newMultipartParser(request,1024*1024*10);
//所有表单都是Part的实例
Partpart_form;
//遍历请求中所有的表单域
while((part_form=mp.readNextPart())!
=null){
//取得表单中name属性
Stringstr_name=part_form.getName();
//判断一下是不是普通表单域,如果是,执行下面
if(part_form.isParam()){
//得到普通表单域的值
ParamPartpp=(ParamPart)part_form;
Stringstr_value=pp.getStringValue(“GBK”);
out.print(“普通表单部分:
name=”+str_name+”;value=“+str_value+”
”);
}
//如果是文件域执行下面
elseif(part_form.isFile()){
//得到文件上传域
FilePartfile_part=(FilePart)part_form;
Stringfile_name=file_part.getFileName();
if(file_name!
=null){
//输出文件内容:
longsize=file_part.writeTo(newFile(request.getRealPath(“/”)));
out.print(“上传文件:
文件域名:
”+str_name+”;文件名:
”+file_name+”;
上传文件的内容:
”+file_part.getFilePath()+
“
文件内容类型:
”+file_part.getContentType()+
“
文件大小:
”+size);
}
//文件名为空
else{
out.println(“file:
name=”+str_name+”EMPTY”);
}
out.flush();
}
}
%>
这样两种上传文件的方法我们都学习过了。
下一节我们来真正的学习一下struts2上传文件
前面做了这么多的铺垫,这次真的要好好讲一下,struts怎么上传了。
struts2是怎么回事这里就不说了,自己去看看struts2我们只讲怎么上传。
工具版本:
jdk6,myeclipse7,tomcat6
首先我们来建一个新的WEB项目。
packagecom.garry.struts.upload;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjavax.servlet.http.HttpServletRequest;
importcom.opensymphony.xwork2.ActionSupport;
//继承ActionSupport是因为可以加验证
publicclassUploadFileextendsActionSupport{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
//这里面所有的upload开头的意思是说,在表单里上传的
privateHttpServletRequestrequest;
//封装文件标题请求参数的属性
privateStringtitle;
//封装上传文件域属性
privateFileupload;
//封装上传文件类型的属性
privateStringuploadContentType;
//封装上传文件名的属性
privateStringuploadFileName;
//接受依赖注入的属性
privateStringsavePath;
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicFilegetUpload(){
returnupload;
}
publicvoidsetUpload(Fileupload){
this.upload=upload;
}
publicStringgetUploadContentType(){
returnuploadContentType;
}
publicvoidsetUploadContentType(StringuploadContentType){
this.uploadContentType=uploadContentType;
}
publicStringgetUploadFileName(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自己 一个 上传 文件