1. 程式人生 > >javaWEB之-----------簡單的相簿管理

javaWEB之-----------簡單的相簿管理

相簿管理

這僅僅只是一個小小的相簿管理,主要實現的功能:能夠實現對圖片的上傳統一瀏覽單個下載單個刪除只能刪除自己上傳的檔案。

現在對每個功能進行單個的解釋:

圖片的上傳 

圖片的上傳在之前的部落格寫的很清楚了。點選開啟連結 在這個相簿管理中,就不是單一的檔案傳了,還需要涉及到很多引數供其他功能模組的使用
<span style="font-size:24px;">//上傳檔案一般採用外面的 apache的上傳工具包
		/*
		 * 我們需要將上傳的檔案放到指定的資料夾下
		 * 要獲得檔案的資訊  檔名   要儲存的資料夾(打散) uuid--dir
		 * 解決中文問題儲存的檔名     uuid.jpg
		 * 每個人都有自己的許可權      ip
		 * 上傳的時間                 dt
		 * 檔案原先的真是名字  relName
		 * 相片的說明  			desc
		 * 檔案的副檔名          ext
		 *上面上傳一個圖片需要這麼多的資訊,,所以 採用 值物件《VO》封裝採用打亂資料夾儲存,讓效能更優。</span>
<span style="font-size:24px;">		 */
		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<FileItem> list=sf.parseRequest(request);
			for(FileItem ff:list){</span>
<span style="font-size:24px;">//前面的都是和之前的那個說的差不多,具體的統計引數就是從這裡開始。</span>
<span style="font-size:24px;">				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();//刪除臨時檔案
			}
		}</span>
上傳除了統計引數,我們需要將資料儲存的xml檔案中,還需要將圖片儲存起來。等瀏覽的時候統一檢視。 效果圖:

統一瀏覽

瀏覽基本就是全部將xml檔案裡面的資料,讀出來,然後統一讀出來顯示。封裝在一個list中,將所有的photo資料封裝在list集合中
//查詢所有的物件然後封裝成一個list物件返回給前端
	public static List<Photo> getAll(){
		
		List<Photo> list=new ArrayList<Photo>();
		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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		List<Photo> 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 = "<table border=1px width='80%'><tr><th>相簿名</th><th>時間</th><th>圖片顯示</th><th>操作</th>";
		out.write(str);
		for(Photo p:list){
			 relName=p.getRelName();
			 dt=p.getDt();
			 imgs=path+"/upFile/"+p.getDir()+"/"+p.getId()+p.getExt();//完成的檔案路徑加檔名
		
			 ss="<tr><td>"+relName+"</td><td>"+dt+"</td><td>"+"<a href='"+imgs+"'><img style='border:0px' width='100' height='100' src='"+imgs+"' alt='圖片'/></a></td>";
			 tt="<td><a href='DownFile?id="+p.getId()+"'>下載</a>  <a href='MyDelelte?id="+p.getId()+"'>刪除圖片</a>"+"</td></tr>";//通過id來區分他們直接的區別 可以進行刪除和下載
			out.write(ss);
			out.write(tt);
		}
效果:

單個下載

下載在之前的上傳和下載中都說的很清楚了。點選開啟連結 下載的程式碼中需要注意:需要設定相應頭和檔名的傳輸
 對於下載檔案需要主要  首先需要讓瀏覽器知道  設定頭
 * 		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<String , Object> deleteByid(String ip,String id) {
		Map<String, Object> map =new HashMap<String, Object>();
		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<String, Object> 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");//重定向到顯示頁面
	}
整個專案的下載連結點選開啟連結 本人處於學習中,剛學到這個知識點。這個技術可能很落後了,本人會好好學習新的技術,讓自己的一直成長。若是需要這個簡單的程式,可以直接找我。。