浏览器预览远程ftp图片

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

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

思路一:从后台传来图片路径,直接在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。 ),尝试使用 Output Stream  ,因而把代码修改成:
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)); 问题解决~以上!