struts2上传文件(二) jsp上传文件

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

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

自己写一个上传的文件

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="upload.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>

JSP代码upload.jsp

< language="java" pageEncoding="utf-8"%>
< import="java.io.InputStream"%>
< import="java.io.BufferedReader"%>
< import="java.io.InputStreamReader"%>
< import="java.io.File"%>
< import="java.io.PrintStream"%>
< import="java.io.FileOutputStream"%>
<%
//得到httpServletRequest的InputStream流
InputStream input = request.getInputStream();
//获得一个BufferedReader对象
BufferedReader br = new BufferedReader(new InputStreamReader(input));
String buffer = "";

//循环读出请求内容的每一行
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();

File file = new File(request.getRealPath("/")+System.currentTimeMillis()+".txt");
//创建一个文件输出流
PrintStream ps = new PrintStream(new FileOutputStream(file));
String content = 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这个项目,会有空指针异常。我们开始编写基于这两个开源项目的上传文件下面是代码:

<%@ page language="java" pageEncoding="utf-8"%>
< import="java.io.File"%>
< import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
< import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
< import="org.apache.commons.fileupload.FileItem"%>
< import="java.io.FileOutputStream"%>
< import="java.io.InputStream"%>
< import="java.util.List"%>
< import="java.util.Iterator"%>
<%
//声名一个工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置上传工厂限制大小
factory.setSizeThreshold(1024*1024*10);//1024*1024是一M 也就上限制上传文件大小为10M
factory.setRepository(new File(request.getRealPath("/")));
//创建一个上传文件的ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
//设置最大上传限制 
upload.setSizeMax(1024*1024*20);
//处理HTTP请求,items是所的有表单项
List items = upload.parseRequest(request);
//遍历所有的表单项
for(Iterator it = items.iterator(); it.hasNext();)
{
FileItem item = (FileItem)it.next();
//判断是不是上传文件,如果不是上传文件就显示出表单域的名字和值
//如果是上传文件,就上传此文件
if(item.isFormField()){
String name = item.getFieldName();
String value = item.getString("utf-8");
out.println("表单域的name=value对应为:"+name+"="+value);
}
else{
//取得文件域的表单域名
String fieldName = item.getFieldName();
//取得文件名
String fileName = item.getName();
//取得文件类型
String contentType = item.getContentType();
//以当前时间来生成上传文件名的文件名
FileOutputStream fos = new FileOutputStream(request.getRealPath("/")+System.currentTimeMillis()+fileName.substring(fileName.lastIndexOf("."),fileName.length()));
//如果上传文件域对应文件的内容已经在内存中
if(item.isInMemory()){
fos.write(item.get());
}
//如果文件内容不完全在内存中
else{
//获取上传文件内容的输入流
InputStream is = item.getInputStream();
byte[] buffer = new byte[1024];
int len;
//读取上传文件的内容,并将其写入上传文件的内容中。
while((len = is.read(buffer))>0){
fos.write(buffer,0,len);
}
is.close();
fos.close();
}
}
}
%>

第二种方法上传:我们要到www.servlets.com/cos站下载项目,把文件解压后,把cos.jar文件放到lib目录下。COS的核心类是MultipartParser。

cosupload.jsp
<%@ page language="java" pageEncoding="utf-8"%>
< import="com.oreilly.servlet.multipart.MultipartParser"%>
< import="com.oreilly.servlet.multipart.Part"%>
< import="com.oreilly.servlet.multipart.ParamPart"%>
< import="com.oreilly.servlet.multipart.FilePart"%>
< import="java.io.File"%>
<%
//设置POST请求的内容最大字节数为10M,该类用于解析HTTP请求
MultipartParser mp = new MultipartParser(request,1024*1024*10);
//所有表单都是Part的实例
Part part_form ;
//遍历请求中所有的表单域
while((part_form = mp.readNextPart())!=null){
//取得表单中name属性
String str_name = part_form.getName();
//判断一下是不是普通表单域,如果是,执行下面
if(part_form.isParam()){
//得到普通表单域的值
ParamPart pp = (ParamPart)part_form;
String str_value = pp.getStringValue("GBK");
out.print("普通表单部分:<br> name="+str_name+" ;value = "+str_value+"<br>");
}
//如果是文件域执行下面
else if(part_form.isFile()){
//得到文件上传域
FilePart file_part = (FilePart)part_form;
String file_name = file_part.getFileName();

if(file_name!=null){

//输出文件内容:
long size = file_part.writeTo(new File(request.getRealPath("/")));
out.print("上传文件:<br>文件域名:"+str_name+" ;文件名:"+file_name+";<br>上传文件的内容:"+file_part.getFilePath()+
"<br>文件内容类型:"+file_part.getContentType()+
"<br>文件大小:"+size );
}
//文件名为空
else{
out.println("file:name="+str_name+"EMPTY");
}
out.flush();
}
}
%>

这样两种上传文件的方法我们都学习过了。下一节我们来真正的学习一下struts2上传文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值