浏览器预览远程ftp图片

来源:互联网 发布:交行网络支付异地消费 编辑:程序博客网 时间:2024/06/05 08:03

需求:在网页上预览带密码的ftp服务器上的图片

最近遇到个需求,要在页面上显示ftp端的图片,但是不要下载到本地。

思路一:从后台传来图片路径,直接在img的src中写入ftp图片路径,发现不显示,百度后发现需要同时传入ftp的用户名和密码,写法如下:
<img src="ftp://bill:BillSanMa1030@test.3mkj.com/test.jpg" />
尝试了一下,哇,显示出来了,so easy,但是在chrome访问,发现图片没有出现,控制台报错了,点开链接如下:

图片



意思是chrome从59版本后同一页面禁止读取不同源的资源,也就是http页面不可以嵌入ftp的资源。尝试了chrome54版本是可以显示的。
思路二:没办法,胳膊拧不过大腿,扛不过google,只能另寻出路,想到从服务端获取图片后,读取出来,转成Base64格式传到前台,
首先百度找到java从ftp获取文件的代码,网上多得很,
再找到将图片转为Base64格式的代码,也是一搜一大把
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.net.ftp.FTPFile;

FTPClient fc = new FTPClient();
// 连接ftp 
fc.connect("test.3mkj.com", 21);  
 // 登录
fc.login("bill", "BillSanMa1030");  
// 设置编码格式 
fc.setControlEncoding("UTF-8");
String remoteAbsoluteFile = fs[0].getName();
remoteAbsoluteFile = new String(remoteAbsoluteFile.getBytes("UTF-8"), "ISO-8859-1");
 // 获得输入流
InputStream in = fc.retrieveFileStream(remoteAbsoluteFile);
byte[] bytes = new byte[in.available()];
int length = in.read(bytes);
String base64Image = new String(Base64.encodeBase64(bytes));

但是,验证发现确实返回了一个Base64格式的字符串,但是却不是正确的图片转化,网上也找不到更详细的资料,仔细研究后发现in.available()比实际文件要小,查看FTPClient API发现retrieveFileStream的描述是“返回从其中一个指定的文件从服务器可以读取的InputStream。”也就是说可能返回的并不是完整文件的InputStream,继续查看API,发现有retrieveFile ( String remote, OutputStream local) (从服务器检索命名文件并将其写入给定的OutputStream。),尝试使用OutputStream ,于是把代码修改为:
FTPFile[] fs = fc.listFiles();
// 获得文件大小
int size = (int) fs[0].getSize();
byte[] bytes = new byte[size];
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 写入输出流
fc.retrieveFile(remoteAbsoluteFile,os);
bytes = os.toByteArray(); 
String base64Image = new String(Base64.encodeBase64(bytes));

问题解决~以上!
原创粉丝点击