簡單圖片服務器的小小心得


簡單情況的,複雜情況不聊,也還沒有那個架構水準。
以一個展示需要很多圖片的web應用作爲例子:
1.如果圖片和web應用都在一臺服務器上,圖片越來越多,那麼必然大量佔用服務器的資源,導致一系列問題。

爲了解決這樣的問題,我們可以將web應用看成這樣的部分組成:不變的web程序包+不斷增長的圖片文件。
那麼我們可以將圖片部分單獨的提取出來,放在另外的一臺服務器上,讓原來的服務器只運行web程序包,網頁上的圖片都用一個

URL地址來指向這些服務器上的圖片的地址,這樣的話網站的性能就明顯提高了,圖片服務器(ImageServer)的概念也就產生了。

2.整個的流程就是這樣的:
web程序包服務器A(http://192.168.1.1:8080/web
圖片服務器B(http://192.168.1.123:8080/fileService
A通過HTTP請求(也就是一個地址)訪問B進行存儲或獲取圖片
主要是通過tomcat自帶的catalina.jar中的org.apache.catalina.servlets.WebdavServlet實現,採用的是webDav協議。
WebDAV (Web-based Distributed Authoring and Versioning) 一種基於 HTTP 1.1協議的通信協議。它擴展了HTTP 1.1,在GET

、POST、HEAD等幾個HTTP標準方法以外添加了一些新的方法,使應用程序可直接對Web Server直接讀寫,並支持寫文件鎖定

(Locking)及解鎖(Unlock),還可以支持文件的版本控制。

 

web服務器A通過頁面操作上傳一張圖片,圖片傳到後臺action,後臺action調用底層,底層此時做的事情有兩個:

一個是將圖片對象加入到一個http請求中,然後將這個請求發送到圖片服務器B。
大致過程如下:
  HttpClient client = new HttpClient();//建立對象
  PutMethod put = new PutMethod(“http://192.168.1.123:8080/fileService”);//設定put方法請求的地址,看了下jar包應該也可以post請求調用put方法
  RequestEntity sImageRequestEntity = new ByteArrayRequestEntity(sImage);
  put.setRequestEntity(sImageRequestEntity);
 //圖片設定到請求中去(圖片流格式要注意,這裏不是具體的正確的格式)
 client.executeMethod(put);//執行設定的請求的方法

一個是請求發送之後,將文件的部分路徑保存下來,存放在數據庫中

圖片服務器B要做什麼事情呢,接收請求,保存圖片。

 

圖片服務器代碼:

public class FileServlet extends WebdavServlet {

	private FileManager fileManager;
         //這裏就是被web應用請求所調用的put方法
	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
				InputStream is = req.getInputStream();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		int b = -1;
		while ((b = is.read()) != -1) {
			baos.write(b);
		}
		try {
			String rootPath = req.getSession().getServletContext().getRealPath(
					"/upload");
			fileManager.setRoot(rootPath);
			fileManager.saveFile(rootPath,
					baos.toByteArray());

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			baos.close();
		}
	}
         //當然還有很多其他的方法,比如,doDelte,doGet等等
	@Override
	public void init() throws ServletException {
		fileManager = new FileManagerImpl();
		super.init();
	}

}

3.圖片保存在了圖片服務器,路徑也保存到了web應用服務器對應的數據庫中了,此時就該頁面顯示了

如:

<img width="224" height="120"  alt="sdfsdf" src="http://192.168.1.123:8080/fileService/upload/1.jpg">


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章