commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例

上传页面,注意设置响应头

<body>
<center>
<h1>文件上传页面</h1><hr>
<form action="${pageContext.request.contextPath }/servlet/UploadServlet" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file1"/><br>
描述信息:<textarea rows="5" cols="45" name="discription"></textarea><br>
<input type="submit" value="上传"/>
</form>
</center>
</body>

上传的servlet

//上传文件
String upload=this.getServletContext().getRealPath("WEB-INF/upload"); String temp=this.getServletContext().getRealPath("WEB-INF/temp"); Map pmap=new HashMap();
//get client IP address
pmap.put("ip", request.getRemoteAddr()); DiskFileItemFactory factory=new DiskFileItemFactory();
//设定内存缓冲区大小 Set the memory buffer size
factory.setSizeThreshold(1024*100);
//指定临时文件目录 Specifies the directory for temporary files
factory.setRepository(new File(temp)); ServletFileUpload fileUpload=new ServletFileUpload(factory);
fileUpload.setHeaderEncoding("utf-8");
fileUpload.setFileSizeMax(1024*1024*100);
fileUpload.setSizeMax(1024*1024*200); //set form style enctype="multipart/form-data"
if(!fileUpload.isMultipartContent(request))
{
throw new RuntimeException("请使用正确的表单进行上传");
} //解析request
try {
List<FileItem> list= fileUpload.parseRequest(request); //遍历list
for(FileItem item:list)
{
if(item.isFormField())
{
String name=item.getFieldName();
String value=item.getString("utf-8"); pmap.put(name, value);
}else
{
String realname=item.getName();
String arry[]=realname.split("\\\\");
realname=arry[arry.length-1];
System.out.println(realname);
String uuidName=UUID.randomUUID().toString()+"_"+realname; pmap.put("realname", realname);
pmap.put("uuidname", uuidName); InputStream in=item.getInputStream();
String hash=Integer.toHexString(uuidName.hashCode());
String savepath="/WEB-INF/upload";
for(char c:hash.toCharArray())
{
upload+="/"+c;
savepath+="/"+c;
}
new File(upload).mkdirs();
pmap.put("savepath", savepath);
OutputStream out=new FileOutputStream(new File(upload,uuidName));
IOUtils.In2Out(in, out);
IOUtils.close(in, out); item.delete();
}
} } catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} //向数据库中插入数据 Resourse r=new Resourse();
try {
BeanUtils.populate(r, pmap);
String sql="insert into netdisk values(null,?,?,?,?,null,?)";
QueryRunner runner=new QueryRunner(DaoUtils.getSource());
runner.update(sql,r.getUuidname(),r.getRealname(),r.getSavepath(),r.getIp(),r.getDescription());
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} //重定向回主页
response.sendRedirect(request.getContextPath()+"/index.jsp");

为防止重名,所以使用了UUIDNAME,把文件上传到web-inf/upload文件夹下,并且将路径与文件名保存到数据库中,上传功能完成

下载实现

下载页面

<body>
<center>
<h1>下载列表</h1><hr>
<c:forEach items="${requestScope.list }" var="r">
<h2>文件名:${r.realname }<br></h2>
上传时间:${r.uploadtime }<br>
上传者IP:${r.ip }<br>
描述信息:${r.description }<br>
<a href="${pageContext.request.contextPath }/servlet/DownServlet?id=${r.id}">下载</a><br><hr>
</c:forEach>
</center>
</body>

下载实现

  response.setContentType("text/html;charset=utf-8");
//获取ID
String id=request.getParameter("id");
//根据ID查找资源
String sql="select * from netdisk where id=?";
Resourse r=null;
QueryRunner runner=new QueryRunner(DaoUtils.getSource());
try {
r= runner.query(sql, new BeanHandler<Resourse>(Resourse.class), id);
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} if(r==null)
{
response.getWriter().write("找不到该资源!!!!");
return;
}else
{
//指定响应头
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(r.getRealname(),"UTF-8"));
response.setContentType(this.getServletContext().getMimeType(r.getRealname()));
String filePath=this.getServletContext().getRealPath(r.getSavepath()+"/"+r.getUuidname());
InputStream in=new FileInputStream(filePath);
OutputStream out=response.getOutputStream();
IOUtils.In2Out(in, out);
IOUtils.close(in, null);
}

上传下载完成,注意,下载时一定要指定两个响应头

IO工具类

public class IOUtils {
private IOUtils() {
} public static void In2Out(InputStream in,OutputStream out) throws IOException{
byte [] bs = new byte[1024];
int i = 0;
while((i=in.read(bs))!=-1){
out.write(bs,0,i);
}
} public static void close(InputStream in,OutputStream out){
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
in = null;
}
}
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
out = null;
}
}
}
}

完成

commons-fileupload实现文件上传下载的更多相关文章

  1. Apache Commons FileUpload 实现文件上传

    Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...

  2. Apache Commons fileUpload实现文件上传之一

      需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...

  3. Spring MVC使用commons fileupload实现文件上传功能

    通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...

  4. Apache Commons FileUpload实现文件上传

    一.Apache Commons-FileUpload简介 Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目. Apache Commons项目由三个部分组成 ...

  5. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  6. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  7. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  8. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  9. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  10. JavaWeb 文件 上传 下载

    文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...

随机推荐

  1. Bootstrap教程:[4]栅格系统详解

    http://jingyan.baidu.com/article/6f2f55a1852aa1b5b83e6c5a.html 们都知道bootstrap3.0使用了四种栅格选项来形成栅格系统,这四种选 ...

  2. IOC 构造函数注入vs属性注入

    1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...

  3. WPF中嵌入Office编辑器(支持Word、Excel、PPT、Visio等)

    现在有一个项目,需要使用wpf做一个简单的客户端,用来生成word.excel.ppt.visio等文档,这就需要能够在wpf中嵌入office的编辑器,并对office文档进行编辑. 在网上搜索了一 ...

  4. 快速反射DataTable

    public class SetterWrapper<TTarget, TValue> { private Action<TTarget, TValue> _setter; p ...

  5. Win7下JDK环境变量的设置

    JDK并不像Microsoft阵营vs那样智能,安装好后所有的东西都给你配置好了,我们还没需要手动配置很多东西 首先说为什么要配置JDK的环境变量在任何路径下识别java命令和java类 配置分为2个 ...

  6. Lua函数之一

    LUA函数之一 函数声明: function foo(arguments) statements end 1.函数调用 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用,例如: os.da ...

  7. nginx负载均衡的配置方法

    upstream www.***.com { server ; server ; server ; } server { listen ; server_name www.***.com; #char ...

  8. mysqldump命令介绍

    命令行下具体用法如下: mysqldump -u用戶名 -p密码 数据库名 表名 > 脚本名; 1.导出单个数据库的所有表的数据和结构 mysqldump -h localhost -uroot ...

  9. ASP.NET MVC4 log4net

    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

  10. How can I style a JavaFX SplitMenuButton in CSS

    0 down vote favorite I try to style a SplitMenuButton in JavaFX. I've got a menuButton and a SplitMe ...