文件上传和下载的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
更多阅读
店铺包邮卡的使用说明 淘宝店铺设置包邮
买家可进入“我的拍拍=》我是买家=》我的优惠卡券=》我的包邮卡”中查看自己已经拥有的店铺包邮卡。使用说明:1、每一张包邮卡只能在所属的店铺内使用;2、使用包邮卡需满足使用规则(如单笔订单满100元)才能使用;3、有效日期内不限使用
怎样申请ftp空间 如何申请ftp上传空间
什么是FTP空间,这里先跟大家说说吧,简单说我们存放网页的,也就是说我们可以通过FTP软件来上传和下载的空间,通常我们个人用户都是把网站放在FTP空间里面,然后通过空间提供商给的域名来进行访问,那要怎样申请FTP空间,FTP空间有分为免费的F
手指上斗和簸箕的含义 手指纹路十个簸箕说法
民间谚语:“一斗穷二斗富,三斗四斗卖豆腐,五斗六斗开当铺,七斗八斗把官做,九斗十斗享清福。”(斗是圆圈,簸萁是条纹)说法一:下面是几个斗几个簸箕人的性格和命运的解释(不一定真,但古书都是这么解释的):0个斗(10个簸箕):直率,与人为善,埋头苦干,脚踏实
Fckeditor,JSP中 限制上传的大小 不同的用户上传到不同目录 限制 jsp限制上传文件类型
在利用fckeditor上传文件的过程中,需要1、限制文件上传的大小。2、限制不同的用户上传的文件到不同的目录。3、限制上传后的图片的高度和宽度4、限制上传图片或者文件的后缀名自己在做工程的过程中,对于以上问题进行了解决,在此记录以
摘录网络 asp 上传代码 支持大文件上传 asp上传图片代码
<%@Language="VBScript"CodePage=65001%> <%OptionExplicit%> <% 'Code:200(上传成功)、504(文件为空)、502(上传上限)、501(表示网络中断)、500(上传错误)、 '505(文件类型禁止上传),506(未设置允许的文件后缀),507(未设