这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件。现在对每个功能进行单个的解释:

图片的上传

图片的上传在之前的文章中写的很清楚了,点击打开链接:《JavaEE实现前后台交互的文件上传与下载》 。

在这个相册管理中,就不是单一的文件传了,还需要涉及到很多参数供其他功能模块的使用

//上传文件一般采用外面的 apache的上传工具包

/*

* 我们需要将上传的文件放到指定的文件夹下

* 要获得文件的信息 文件名 要存储的文件夹(打散) uuid--dir

* 解决中文问题存储的文件名 uuid.jpg

* 每个人都有自己的权限 ip

* 上传的时间 dt

* 文件原先的真是名字 relName

* 相片的说明 desc

* 文件的扩展名 ext

*上面上传一个图片需要这么多的信息,,所以 采用 值对象《VO》封装采用打乱文件夹存储,让性能更优。

*/

request.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

PrintWriter out=response.getWriter();

//读文件用到apache的两个包

//临时存储目录

File f =new File("f:/ex/temp");//存放临时文件的目录

DiskFileItemFactory dff=new DiskFileItemFactory(1024*1024*20, f);//允许临时存储文件大小为20M

//解析的文件的工具

ServletFileUpload sf =new ServletFileUpload(dff);

sf.setSizeMax(1024*1024*50);//允许存储容量为50M

sf.setFileSizeMax(1024*1024*20);//单个文件最大容量为 20M

String path=getServletContext().getRealPath("/upFile");//获得文件的所在磁盘的路径--》存储位置

Photo p =new Photo();

InputStream in=null;//拷贝流需要

boolean boo=false;

FileItem f0=null;//用来删除临时文件

try {

List list=sf.parseRequest(request);

for(FileItem ff:list){

//前面的都是和之前的那个说的差不多,具体的统计参数就是从这里开始。

f0=ff;

if(ff.isFormField()){//这个为描述的内容

String name=ff.getString("utf-8");//采用utf-8的编码方式去读

p.setDesc(name);//1 文件的描述

}else{

String name=ff.getName();//获得文件本框里面的内容--->整个图片的目录

//System.out.println("name:"+name);

String id=UtilsFactory.getUUid();

p.setId(id);//6

String dirs=UtilsFactory.getDir(id);//获得文件夹目录----使用uuid一一打散了的

p.setDir(dirs);//2 打乱之后的目录

p.setDt(UtilsFactory.getDate());//3 时间

String relname=name.substring(name.lastIndexOf("/")+1);

p.setRelName(relname);//4 文件的真实名字

String ext=name.substring(name.lastIndexOf("."));

p.setExt(ext);//5 文件扩展名

p.setIp(request.getRemoteAddr());//7 IP

boo =MyDao.Add(p);//保存到xml文件中

if(boo){//保存成功

path=path+"/"+p.getDir();

File f1 =new File(path);//判断文件的存储路径是否存在,不存在就创建

if(!f1.exists()){

f1.mkdirs();

}

in=ff.getInputStream();

FileUtils.copyInputStreamToFile(in,new File(path+"/"+p.getId()+p.getExt()) );

}

}

}

} catch (FileUploadException e) {

boo=false;

}finally{

if(f0!=null){

f0.delete();//删除临时文件

}

}

上传除了统计参数,我们需要将数据存储的xml文件中,还需要将图片存储起来。等浏览的时候统一查看。

效果图:

统一浏览

浏览基本就是全部将xml文件里面的数据,读出来,然后统一读出来显示。封装在一个list中,将所有的photo数据封装在list集合中

//查询所有的对象然后封装成一个list对象返回给前端

public static List getAll(){

List list=new ArrayList();

Document dom =DocumentFactory.getDocument();

Element root=dom.getRootElement();

Iterator it=root.elementIterator();//这是根节点遍历器

while(it.hasNext()){

Element e=(Element) it.next();//找到节点

Photo p =new Photo();//每一的photo地址不一样,所以必须每次新开空间

p.setDesc(e.attributeValue("desc"));//文件描述符

p.setDir(e.attributeValue("dir"));//文件目录

p.setDt(e.attributeValue("dt"));//时间

p.setExt(e.attributeValue("ext"));//文件扩展名

p.setId(e.attributeValue("id"));//uuid生成的id

p.setIp(e.attributeValue("ip"));

p.setRelName(e.attributeValue("relname"));

list.add(p);

}

return list;

}

具体代码:

//浏览相册需要把所有的文件读出来。需要一一去读,所以需要去读所有的xml文件

response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");

PrintWriter out = response.getWriter();

out.println(""-//W3C//DTD HTML 4.01 Transitional//EN\">");

out.println("");

out.println("

A Servlet");

out.println("

");

List list=MyDao.getAll();//获得所有xml文件里面的内容,数据全部封装到list中

String path=getServletContext().getContextPath();//进入web之后要采用相对路径才能访问的到

String ss=null;

String imgs=null;

String dt=null;

String relName;

String tt=null;

String str = "

相册名 时间 图片显示 操作

out.write(str);

for(Photo p:list){

relName=p.getRelName();

dt=p.getDt();

imgs=path+"/upFile/"+p.getDir()+"/"+p.getId()+p.getExt();//完成的文件路径加文件名

ss="

"+relName+""+dt+""+"";

tt="

下载 删除图片"+"";//通过id来区分他们直接的区别 可以进行删除和下载

out.write(ss);

out.write(tt);

}

效果:

单个下载下载在之前的上传和下载中都说的很清楚了,点击打开链接: 《JavaEE实现前后台交互的文件上传与下载》。

下载的代码中需要注意:需要设置相应头和文件名的传输

对于下载文件需要主要 首先需要让浏览器知道 设置头

* response.setContentType("application/force-download");//设置相应头,告诉浏览器这是下载文件

* 第二就是设置文件名了

* response.setHeader("Content-Disposition","attachment;filename='"+relName+"'");//下载是那边显示的是原来文件名

下面是具体的代码:

response.setContentType("application/force-download");//设置相应头,告诉浏览器这是下载文件

request.setCharacterEncoding("utf-8");

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

Photo p=MyDao.getSingalByid(id);//通过id获得要下载的对象

//写入真实名字

if(p!=null){

String relName1=p.getRelName();

String relName=URLEncoder.encode(relName1, "utf-8");

response.setHeader("Content-Disposition","attachment;filename='"+relName+"'");//下载是那边显示的是原来文件名

OutputStream out =response.getOutputStream();//写文件时候需要

//路径

String path="/upFile/"+p.getDir()+"/"+p.getId()+p.getExt();

String path1 =getServletContext().getRealPath(path);

System.out.println(path1);//检测

InputStream in=new FileInputStream(path1);

byte[] b=new byte[1024];

int len =0;

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

out.write(b, 0, len);

}

}else{

response.setContentType("utf-8");

PrintWriter pw =response.getWriter();

pw.write("文件不存在无法下载");

}

}

效果图:

删除文件

删除文件需要用到的技术相对其他功能

要匹配IP,ID这样才能让删除的时候用权限

//删除照片

public static Map deleteByid(String ip,String id) {

Map map =new HashMap();

Document dom =DocumentFactory.getDocument();

Element ele=(Element) dom.selectSingleNode("//photo[@id='"+id.trim()+"']");//xpath的使用

if(ele==null){

map.put("success", false);

map.put("msg", "已经删除");

return map;

}else{

String tempip=ele.attributeValue("ip");

if(!tempip.equals(ip)){

map.put("success", false);

map.put("msg", "你不能删除别人的照片");

return map;

}else{

map.put("success", true);

//访问成功后,把数据分装成一个值对象,返回给逻辑层 我们这样直接删除,只是xml文件里面的节点删除,但是已经存储的文件是没有删除的

Photo p =new Photo();

p.setId(id);

p.setExt(ele.attributeValue("ext"));

p.setDir(ele.attributeValue("dir"));

map.put("photo", p);

//真正的数据删除

ele.getParent().remove(ele);

DocumentFactory.Save();

return map;

}

}

request.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

PrintWriter out=response.getWriter();

String id =request.getParameter("id");//从客户端传过来的消息

String ip =request.getRemoteAddr();

Map map =MyDao.deleteByid(ip,id);

if(map.get("success").equals(false)){//这都是删除不成功的

out.print("消息为:"+map.get("success"));

}else{

Photo p =(Photo) map.get("photo");//根据photo里面的文件名和路径删除文件

String path=getServletContext().getRealPath("upFile");

String filename=path+"/"+p.getDir()+"/"+p.getId()+p.getExt();//文件的路径包括文件名

System.out.println(filename);

File f=new File(filename);

if(f.exists()){

System.out.println(f.getName());

f.delete();//删除文件

}

}

response.sendRedirect("LookPhoto");//重定向到显示页面

}

整个项目的下载链接: 《javaWEB实现相册管理的简单功能》

正在处于学习中,刚学到这个知识点,技术可能很落后了,但也愿意分享给大家,大家共同进步。

实现相册功能 java_javaWEB实现相册管理的简单功能相关推荐

  1. 编程实现一个学生成绩管理的简单功能 JAVA

    1.编程实现一个学生成绩管理的简单功能 能描述学生的姓名.学号.成绩(单科).能显示学生的个人信息. 能描述教师的姓名.工号,能对学生成绩进行设置.修改.查询. 能描述教务的姓名.工号,能对学生信息进 ...

  2. java web相册_javaWEB实现相册管理的简单功能

    这仅仅只是一个小小的相册管理,主要实现的功能:能够实现对图片的上传,统一浏览,单个下载,单个删除,只能删除自己上传的文件.现在对每个功能进行单个的解释: 图片的上传 图片的上传在之前的文章中写的很清楚 ...

  3. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)

    Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能) 导读 动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能) 目录 ...

  4. PHP个人相册管理系统源码,实现了相册分类和相册分组,还有相册图片管理,数据库采用mysql,实现了登录注册功能

    PHP个人相册管理系统,实现了相册分类和相册分组,还有相册图片管理,数据库采用mysql,实现了登录注册功能.PHP个人相册源码,相册管理系统,PHP相册管理系统,界面美观简单,适合用来当做课程设计或 ...

  5. javaweb(servlet)+jsp+Mysql实现的简单相册管理系统(功能包含登录、管理首页、添加图片、分类管理、修改密码、图片详情等)

    博客目录 javaweb(servlet)+jsp+Mysql实现的简单相册管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 javaweb(servlet)+jsp+Mysql实现的简单相 ...

  6. 相册服务器位置,王者荣耀游戏相册是什么 游戏相册开放服务器以及功能使用详细介绍...

    王者荣耀游戏相册哪些服务器开放了?新功能怎么使用?对于这个新上线的功能,小伙伴们不太了解吧!没关系,下面是大麦子小编整理出来的游戏相册开放服务器以及功能使用详细介绍,希望可以帮到大家. 游戏相册灰度发 ...

  7. 华为G9怎么找到云相册_华为云相册,三大亮点功能助力P9摄影新体验

    原标题:华为云相册,三大亮点功能助力P9摄影新体验 [前言]:徕卡相机时代,大家用老相册保存照片.华为P9,携手徕卡跨进智能拍摄新时代时,还布局了"华为智能云相册".华为云相册,不 ...

  8. qq空间的相册名称java_jsp实现仿QQ空间新建多个相册名称并向相册中添加照片功能...

    工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删 ...

  9. jsp实现仿QQ空间新建多个相册名称,向相册中添加照片

    工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删 ...

最新文章

  1. 基于Golang的CLI 命令行程序开发
  2. 在SecureCRT下使用sz下载和rz上传文件
  3. 2021年自然语言处理学习路线!
  4. 8张图让你一步步看清 async/await 和 promise 的执行顺序
  5. Centos7 安装lnmp
  6. IOS开发之Swift学习笔记
  7. Mantle For iOS
  8. C/C++基础语法复习(二):C++ 面向对象编程,你需要知道的点
  9. mysql表导入redis_MySQL数据导入Redis
  10. 用命令实现Win7远程桌面关机和重启
  11. Netty新连接接入与NioSocketChannel分析
  12. 七个迹象说明你可能受到APT 攻击
  13. linux 进入shell命令,linux或者shell进入vi命令
  14. vb.net 同时给多个属性赋值_一个float值赋值给double,结果是什么?进来重温一下类型提升吧...
  15. python比java_对比java和python对比
  16. 移动硬盘测试扩容卡软件,U盘扩容检测教程,优盘容量真实性检测,TF卡移动硬盘SD卡内存卡...
  17. 植物大战僵尸PC端修改器(WG)分析及代码实现
  18. 从业17年,聊聊关于测试这件事
  19. hadoop官网下载地址:
  20. Qt 实现libVLC视频显示

热门文章

  1. 照度/感光度(Lux)
  2. 赛氪2020上半年 A.转换AV号(avtobv)[神奇的输入][神奇的getchar()][进制转换]
  3. linux CentOS7安装VCS、Verdi、SCL
  4. 复旦大学《数学分析》教学大纲,读后有感
  5. 制作docker容器镜像
  6. 阿里后端常用的 15 款开发工具,你不试试?
  7. 服务器组装 华硕主板,华硕主板装机教程 华硕主板装机步骤
  8. 50行Python代码,一键获取微博热点!
  9. Android 分享功能之 微信 图片分享
  10. 百度编辑器抓取微信图片并替换内容