需求是這樣的:
圖片文件放在遠程FTP服務器上,圖片是用作宣傳的,很大。用戶只能訪問web服務器,用戶需要在web上先預覽圖片的縮略圖,然后點擊鏈接下載該圖片。
目前有兩種解決方案
第一種方案,通過web服務器的jsp去連接ftp客戶端,讀取到遠程FTP服務器上的圖片,生成縮略圖,返回到頁面,然后用戶選擇想下載的圖片,再一次通過jsp連接ftp下載到客戶端。
示例代碼如下:
<%--
Document : img
Created on : 2007-10-30, 0:02:28
Author : autumn
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="java.awt.*" %>
<%@ page import="com.sun.image.codec.jpeg.*" %>
<%@ page import="sun.net.ftp.FtpClient" %>
<%@ page import="sun.net.TelnetInputStream" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%
String path = request.getParameter("path");


try ...{
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
out.clear();
response.setContentType("image/jpg");
response.addHeader("pragma","NO-cache");
response.addHeader("Cache-Control","no-cache");
response.addDateHeader("Expries",0);

/**//*連接ftp服務器*/
FtpClient fc = new FtpClient();
fc.openServer("127.0.0.1"); //連接ftp服務器,參數為ftp服務器地址
fc.login("test", "test"); //登錄ftp服務器,參數為ftp用戶名密碼
fc.binary(); //轉成二進制模式
TelnetInputStream bis = fc.get(path); //獲取文件,返回輸入流
BufferedImage image = javax.imageio.ImageIO.read(bis);
bis.close(); //關閉輸入流
fc.closeServer(); //關閉服務器連接

/**//*生成縮略圖*/
float tag_w=80;
float tag_h=60;
int old_w=image.getWidth(null); //得到源圖寬度
int old_h=image.getHeight(null); //得到源圖高度
int new_w=0; //縮略圖的寬度
int new_h=0; //縮略圖的高度
float tempdouble;

if(old_w>old_h)...{
tempdouble=old_w/tag_w;

}else...{
tempdouble=old_h/tag_h;
}
new_w=Math.round(old_w/tempdouble); //計算縮略圖高度
new_h=Math.round(old_h/tempdouble); //計算縮略圖寬度
BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(image,0,0,new_w,new_h,null); //繪制縮小后的圖
ServletOutputStream outStream = response.getOutputStream();
JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);
encoder.encode(tag);
outStream.close();
response.reset();

} catch (Exception ex) ...{
//異常處理
}
%>

<%...--
Document : main
Created on : 2007-10-30, 0:02:11
Author : autumn
--%>


<%...@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h3>FTP img tset</h3>
<img src="img.jsp?path=/2.jpg"/>
</body>
</html>
上例只實現從遠程獲得圖片生成縮略圖返回,沒有實現遠程下載圖片,不過原理一樣。
這個方案有一個缺點,就是生成縮略圖前,得從ftp服務器讀取大圖,速度比較慢。
第二種解決方案是在遠程ftp服務器架設一個web server,兩個服務器共享文件目錄,把生成縮略圖的工作放在遠程,而傳回來的只是縮略圖,所以速度會快不少。