浏览器预览远程ftp图片

需求:在网页上预览带密码的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。 ),尝试使用 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));

问题解决~以上!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值