commons-fileupload实现文件上传下载
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实现文件上传下载的更多相关文章
- Apache Commons FileUpload 实现文件上传
Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...
- Apache Commons fileUpload实现文件上传之一
需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...
- Spring MVC使用commons fileupload实现文件上传功能
通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...
- Apache Commons FileUpload实现文件上传
一.Apache Commons-FileUpload简介 Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目. Apache Commons项目由三个部分组成 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- java web 文件上传下载
文件上传下载案例: 首先是此案例工程的目录结构:
- 2013第38周日Java文件上传下载收集思考
2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...
- JavaWeb 文件 上传 下载
文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...
随机推荐
- AppStore占坑注意事项
AppStore占坑注意事项 我们会提前在AppStore(iTunesConnect)里注册一些应用名称,以满足未来业务需要和防止恶意注册,其中有一些需要注意的事情,整理如下: 倒计时180天 为了 ...
- OMNET++工具的使用(2)
http://blog.csdn.net/codingkid/article/details/7085214 首先解决一些概念上的问题: 1. 在omnetpp.org中提到的仿真模型和框架与OMNe ...
- 初学structs2,表单验证简单补充
一.使用注解方式,跳过验证某个方法 由于在开发中,我们不需在请求每一个action类中的方法时都要走validate方法,那么我们可以在这些不需要验证的方法上加上@SkipValidation注解即可 ...
- svn代码回滚命令
代码回滚提交: 比如要把73回滚到68 svn merge -r 73:68 http://my.repository.com/my/project/trunk 然后commit就行了 svn com ...
- H2Database数据类型
数据类型 整数(INT) 布尔型(BOOLEAN) 微整数(TINYINT) 小整数(SMALLINT) 大整数(BIGINT) 标识符(IDENTITY) 货币数(DECIMAL) 双精度实数( ...
- [Redis]c# redis缓存辅助类
public static class RedisCache { private static IRedisClient RCClient = null; /// <summary> // ...
- apache 配置多个虚拟主机
修改文件:httd.conf 文件地址:D:\wamp\bin\apache\Apache2.2.21\conf #配置虚拟主机<VirtualHost 127.0.0.3:80>Serv ...
- Ubuntu如何安装secureCRT
以前在ubuntu上安装过secureCRT,是自己按照网上的教程安装的. 电脑重装了系统之后,想在电脑上安装一个,又得去网上搜,安装完后,自己总结了一下. 1,下载secureCRT包 根据自己电脑 ...
- 推迟调用以及Lambda表达式
背景 GMock 我们项目中现在的模块测试框架使用了CATCH+GMock的方式实现回归测试和打桩. GMock的介绍在官网上有,这里为了铺垫,大概地描述一下GMock能实现的效果.大约可以看成这样: ...
- [Effective JavaScript 笔记] 第11条:熟练掌握闭包
理解闭包三个基本的事实 第一个事实:js允许你引用在当前函数以外定义的变量. function makeSandwich(){ var magicIngredient=”peanut butter”; ...