场景描述:
在做与第三方对接时,对方直接给我一个ftp链接,然后我通过这个连接复制到浏览器中可以直接拿到文件,但是菜鸟一个,不知道怎样去用代码处理。以为可以直接通过链接访问就可以拿到图片,但是试了不可以,还是要经过处理才可以获取图片等信息。
声明:
代码大部分是借鉴网上的,写这篇博客只是为了学习一下,希望也可以给大家一点点小小的帮助,如有问题,欢迎各位大佬指正。
注意问题:
哪怕你直接可以用链接在浏览器中拿到文件或图片,也需要去设置登录和ip和端口号等信息。
public static String getImage(String url,String filename) throws Exception {
FTPClient ftp = new FTPClient(); //创建一个ftp对象
String fileNames = null; //文件名
StringBuffer filesN = null;
try{
ftp.connect(); //设置ip和端口
ftp.login(); //设置用户名和密码
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
int replyCode = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)){
ftp.disconnect();
}
ftp.enterLocalPassiveMode();
//获取文件流
ByteArrayOutputStream baos = null;
boolean chage = ftp.changeWorkingDirectory(url); //判断切换目录是否成功
System.out.println("是否切换目录成功"+chage);
InputStream retrieveFileStream = ftp.retrieveFileStream(new String(filename.getBytes("UTF-8"),"iso-8859-1")); //读取相应文件名的文件
if (null == retrieveFileStream) {
throw new FileNotFoundException(filename);
}
baos = new ByteArrayOutputStream();
int length;
byte[] buf = new byte[2048];
while (-1 != (length = retrieveFileStream.read(buf, 0, buf.length))) {
baos.write(buf, 0, length);
}
ByteArrayInputStream fis = new ByteArrayInputStream(baos.toByteArray());
baos.flush();
baos.close();
byte[] buffer = new byte[fis.available()];
int offset = 0;
int numRead = 0;
while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
offset += numRead;
}
if (offset != buffer.length) {
throw new IOException("Could not completely read file ");
}
fis.close();
String asB64 = new BASE64Encoder().encode(buffer); //进行base64转码
fileNames = asB64;
retrieveFileStream.close();
ftp.completePendingCommand();
}catch (Exception e) {
e.printStackTrace();
}finally{
if(ftp!=null&&ftp.isConnected())
{
try {
ftp.disconnect();
}catch (Exception e){
e.printStackTrace();
}
}
}
return fileNames;
}
前端接收:
img = "data:image/jpeg;base64," + data; //对后台返回的base64流进行处理
//然后用image里面的src属性可以直接引用
$('#img').prop('src',img);