文件上传和下载的commons-fileupload-1.2的使用 - Aflyer 天与.. commons fileupload包

网上看了很多样例,但是有很多都是过时的,里面使用的包中的FileUpload类在新的1.2里面已经改变,所以我们不能照搬原来的方法 ,除非你放弃使用新版本的jar包。
文件上传和下载的commons-fileupload-1.2的使用 - Aflyer 天与.. commons fileupload包

2.1 jsp方式上传

upload.jsp

<%@ page language="java" %>

<%@ page contentType = "text/html;charset=gb2312"%>

<html>

<head>

<title>文件上传演示</title>

</head>

<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="40" marginwidth="0" marginheight="0">

<center>

<h1>文件上传演示</h1>

<form name="uploadform" method="POST" action="save.jsp" ENCTYPE="multipart/form-data">

<table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">

<tr><td width="100%" colspan="2">

文件1:<input name="file1" size="40" type="file">

</td></tr>

<tr><td width="100%" colspan="2">

文件2:<input name="file2" size="40" type="file">

</td></tr>

<tr><td width="100%" colspan="2">

文件3:<input name="file3" size="40" type="file">

</td></tr>

</table>

<br/><br/>

<table>

<tr><td align="center"><input type="submit" name="submit" value="开始上传"/></td></tr>

</table>

</form>

</center>

</body>

</html>

该文件唯一要注意的地方就是红色粗体的地方,其他的没有什么区别。而正是在这个奇怪的参数上,我们利用servlet处理表单的时候就带来了一个特殊的处理方式(见后分析);

save.jsp

<%@ page language="java" contentType="text/html;charset=GBK"%>

<%@ page import="java.util.*"%>

<%@ page import="java.io.*"%>

<%@ page import="org.apache.commons.fileupload.*"%>

<html>

<head>

<title>保存上传文件</title>

</head>

<body bgcolor=‘#FFFFFF‘ text=‘#000000‘ leftmargin=‘0‘ topmargin=‘40‘ marginwidth=‘0‘ marginheight=‘0‘>

<font size=‘6‘ color=‘blue‘>文件列表:</font>

<center>

<table cellpadding=0 cellspacing=1 border=1 width=‘100%‘>

<tr>

<td bgcolor=#008080>文件名</td>

<td bgcolor=#008080>大小</td>

</tr>

<%

String msg = "";

DiskFileUpload fu = new DiskFileUpload();

// 设置允许用户上传文件大小,单位:字节

// fu.setSizeMax(10000000);

// 设置最多只允许在内存中存储的数据,单位:字节

// fu.setSizeThreshold(4096);

// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录

//(临时存放目录,文件上传完毕后有办法清除它吗?)

fu.setRepositoryPath("D:\TEMP");

//开始读取上传信息

List fileItems = fu.parseRequest(request);

// 依次处理每个上传的文件

Iterator iter = fileItems.iterator();

while (iter.hasNext())

{

FileItem item = (FileItem) iter.next();

//忽略其他不是文件域的所有表单信息

if (!item.isFormField())

{

String name = item.getName();//获取上传的文件名

long size = item.getSize();//获取上传的文件大小(字节为单位)

if((name==null||name.equals("")) && size==0)

continue;//跳到while检查条件

out.println("<tr>");

out.println("<td>" + name + "</td>");

out.println("<td>" + size + "</td>");

//以下为文件名处理,将上传的文件保存在项目所在目录下。

//获取文件名字符串的长度

int end = name.length();

//返回在此字符串中最右边出现的指定子字符串的索引。

int begin = name.lastIndexOf("\");

File savedFile = new File("c:\TEMP", name.substring(begin+1,end));

item.write(savedFile);

}

}

%>

</table>

<br><br>

<a href="upload.jsp">返回上传页面</a>

</center>

</body>

</html>

以上两个文件均是来自网上,我已经做了局部修改。

2. SERVLET的处理

前面提到了那个特殊的form 参数ENCTYPE="multipart/form-data",我在做servlet的时候用通常的request.getParameter("id"),无法捕捉到该form 表单的值。我们要特殊处理这个表单。

以下截取的部分servlet内容:

假设 我的form里面有 id,serid,adjunctname 3个name,而adjunctname的type是file的,其他的是text的。

String id = ChineseString.chineseStr(request.getParameter("id"));

String serid = ChineseString.chineseStr(request.getParameter("serid"));

String adjunctname = ChineseString.chineseStr(request

.getParameter("adjunctname"));

String oldFile = ChineseString.chineseStr(request

.getParameter("oldFile"));

String downLoadFile = ChineseString.chineseStr(request

.getParameter("downLoadFile"));

if (ServletFileUpload.isMultipartContent(request)) {

// Create a factory for disk-based file items

DiskFileItemFactory factory = new DiskFileItemFactory();

// Set factory constraints

factory.setSizeThreshold(20 * 1024);

factory.setRepository(factory.getRepository());

// Create a new file upload handler

ServletFileUpload upload = new ServletFileUpload(factory);

// Set overall request size constraint

upload.setFileSizeMax(20 * 1024 * 1024);

List formlists = null;

try {

formlists = upload.parseRequest(request);

} catch (FileUploadException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

Iterator iter = formlists.iterator();

while (iter.hasNext()) {

FileItem formitem = (FileItem) iter.next();

if (!formitem.isFormField()) {

String name = ChineseString.chineseStr(formitem.getName());

adjunctsize = new Long(formitem.getSize()).toString();

if ((name == null || name.equals(""))

&& adjunctsize.equals("0"))

continue;

// 获取纯粹的文件名

adjunctname = name.substring(name.lastIndexOf("\") + 1);

String suffixName = "."

+ adjunctname.substring(adjunctname

.lastIndexOf(".") + 1);

newadjunctname = new Long(GetTime.getSystemCalendar())

.toString()

+ suffixName;

// 创建文件

File savefile = new File(IConstant.ADJUNTFILEPATH

+ newadjunctname);

// File savefile=new File("c:\TEMP" + newadjunctname);

// 写入文件

try {

formitem.write(savefile);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}else{

String formname=formitem.getFieldName();//获取form中的名字

String formcontent=formitem.getString();

formname=new String(formname.getBytes(),"gb2312");

formcontent=new String(formcontent.getBytes(),"gb2312");

if (formname.equals("id")){

id = formcontent;

}else if(formname.equals("serid")){

serid = formcontent;

}

}

}

}

当我提交页面时得到的id 和serid 均是空的,于是做了这样的一个处理

if (!formitem.isFormField())

判断是否是文件域,如果不是转向文本域处理

String formname=formitem.getFieldName();//获取form中的名字

String formcontent=formitem.getString();

formname=new String(formname.getBytes(),"gb2312");

formcontent=new String(formcontent.getBytes(),"gb2312");

if (formname.equals("id")){

id = formcontent;

}else if(formname.equals("serid")){

serid = formcontent;

}

这样才能得到正确的form 中id,serid的值

3. 文件名称或路径乱码的处理

在servelet的处理代码里面,我们看见了一些字符编码的转换,如:

a.String downLoadFile = ChineseString.chineseStr(request

.getParameter("downLoadFile"));

b.formname=new String(formname.getBytes(),"gb2312");

ChineseString.chineseStr 是自己做的一个公共的转换函数,内容如下:

public static String chineseStr(String str) {

try {

if (str == null)

return "";

String tempStr = str;

byte[] tempArray = tempStr.getBytes("ISO8859-1");

String temp = new String(tempArray);

return temp;

} catch (Exception ex) {

System.out

.println("Exception : com.sclh.common.ChineseString/chineseStr() "

+ ex.getMessage());

}

return "";

}

4. 下载页面

有了上传页面,我们在添加一个下载的页面:

<%@ page contentType="text/html;charset=gb2312" language="java" %>

<%@ page import="java.io.*"%>

<%@ page import="com.sclh.rsp.servicecenter.commom.*"%>

<%@ include file="../common.jsp"%>

<%

String downLoadFile = IConstant.ADJUNTFILEPATH+ChineseString.nullToStr(request.getParameter("downLoadFile"));

String oldFile = request.getParameter("oldFile");

//oldFile=oldFile.replaceAll(";", "");

if((oldFile.length())>50){

oldFile=oldFile.substring(0,20);

}

if (!"".equals(downLoadFile)) {

String fullFileName = downLoadFile;

File file = new File(fullFileName);

if (file.exists()) {

try {

FileInputStream fileContext = new FileInputStream(fullFileName);

BufferedInputStream inStream = new BufferedInputStream(fileContext);

response.reset();

response.setContentType("application/x-msdownload");

oldFile = java.net.URLEncoder.encode(oldFile, "utf-8");

response.setHeader("Content-Disposition", "attachment; filename="+ oldFile);

// response.setHeader("content-encoding","gzip");

// response.setHeader("content-encoding","compress");

OutputStream sOut = response.getOutputStream();

byte[] b = new byte[4096];

int len = 0;

while ( (len = inStream.read(b)) != -1) {

sOut.write(b, 0, len);

}

sOut.close();

}

catch (IOException ex) {

//System.out.println("Exception : downLoad.jsp " + ex.getMessage());

}

}

else {

response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下载的文件不存在!"));

}

}

else {

response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下载文件时参数错误!"));

}%>

这个文件中的oldFile和 downLoadFile 就是为了解决下载乱码和下载文件名称而做的参数。如果缺少oldFile的处理 文件将会显示的下载名称为DownLoad.jsp。

而IConstant.ADJUNTFILEPATH 变量定义的是附件存放的地方,在使用中定义

以下是还涉及到下载页面的部分jsp代码:

<td width="17%" height="24" valign="middle" align="center"><a class=listlink href="javascript:onclick=confirmDel(‘<%=entity[i].getId()%>‘,‘<%=intPage%>‘)">删除</a>|<a class=listlink href="#" onClick="location.href=‘/AdjunctDataServlet?id=<%=entity[i].getId()%>&page=<%=intPage%>&action=update‘">修改</a>|<a class=listlink href="javascript:onclick=downfile(‘<%=entity[i].getAdjunctname()%>‘,‘<%=entity[i].getNewadjunctname()%>‘)">下载</a></td>

function downfile(oldFile,downLoadFile) {

location.href="/AdjunctDataServlet?action=downLoadFile&oldFile="+oldFile+"&downLoadFile="+downLoadFile;

}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1593398

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/138867.html

更多阅读

店铺包邮卡的使用说明 淘宝店铺设置包邮

买家可进入“我的拍拍=》我是买家=》我的优惠卡券=》我的包邮卡”中查看自己已经拥有的店铺包邮卡。使用说明:1、每一张包邮卡只能在所属的店铺内使用;2、使用包邮卡需满足使用规则(如单笔订单满100元)才能使用;3、有效日期内不限使用

怎样申请ftp空间 如何申请ftp上传空间

什么是FTP空间,这里先跟大家说说吧,简单说我们存放网页的,也就是说我们可以通过FTP软件来上传和下载的空间,通常我们个人用户都是把网站放在FTP空间里面,然后通过空间提供商给的域名来进行访问,那要怎样申请FTP空间,FTP空间有分为免费的F

手指上斗和簸箕的含义 手指纹路十个簸箕说法

民间谚语:“一斗穷二斗富,三斗四斗卖豆腐,五斗六斗开当铺,七斗八斗把官做,九斗十斗享清福。”(斗是圆圈,簸萁是条纹)说法一:下面是几个斗几个簸箕人的性格和命运的解释(不一定真,但古书都是这么解释的):0个斗(10个簸箕):直率,与人为善,埋头苦干,脚踏实

声明:《文件上传和下载的commons-fileupload-1.2的使用 - Aflyer 天与.. commons fileupload包》为网友假面超人分享!如侵犯到您的合法权益请联系我们删除