跨域请求ftp服务器获取图片文件,并以base64格式返回给前端

场景描述:

在做与第三方对接时,对方直接给我一个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);

上一篇:java操作ftp


下一篇:分布式实时分析数据库citus数据插入性能优化之二