使用JavaInputStream读取FTP图片到远程服务器

最近需要做一个新需求,要读取ftp服务器的图片,然后保存到另一台服务器上,ftp的访问路径是经过apache转换的,记录一下遇到的坑。我的方案是想办法拿到这张图片的输入流,然后通过FTPClient上传到另一台服务器,在网上找到了如何拿到输入流,并保存本地的方法。

Java从网络读取图片通过InputStream保存至本地,代码如下:

package com.bayonet.action;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class Test
{public static void main(String[] args){InputStream inStream = null;FileOutputStream outStream = null;try{// 定义一个URL对象,并把http路径放进去URL urlConet = new URL("http://xxx.xxx.xx.xx/xxx/xxx/P.JPG");// 打开连接HttpURLConnection con = (HttpURLConnection) urlConet.openConnection();// 设置请求方式为GETcon.setRequestMethod("GET");// 设置超时响应时间为5秒con.setConnectTimeout(6 * 1000);// 通过输入流获取图片inStream = con.getInputStream();// 定义图片放置绝对路径String pathName = "D://xxx.JPG";// 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例File file = new File(pathName);// 如果路径不存在if (!file.exists()){// 那就创建它file.mkdirs();}// 创建输出流,并把文件路径放置进去outStream = new FileOutputStream(file);// 定义缓冲区,即为在内存开的内存空间是1024,也就是一次最多读取1024个字节byte[] b = new byte[1024];// 使用输入流从buffer里把数据读取出来 每次读取的字符串长度,如果为-1,代表全部读取完毕while ((inStream.read(b)) != -1){// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度outStream.write(b);// 写入数据}inStream.close();outStream.close();}catch (Exception e){e.printStackTrace();}finally{if (inStream != null){try{//关闭输入流inStream.close();}catch (IOException e){e.printStackTrace();}}if (outStream != null){try{//关闭输出流outStream.close();}catch (IOException e){e.printStackTrace();}}}}}

Java获取输入流上传图片至FTP服务器,代码如下:

package com.bayonet.action;import java.io.InputStream;
import java.net.URL;
import com.bayonet.utils.FTPUtil;public class Test
{public static void main(String[] args){InputStream inStream = null;try{// 定义一个URL对象,并把http路径放进去URL urlConet = new URL("http://xxx.xxx.xx.xx/xxx/xxx/P.JPG");// 通过输入流获取图片inStream = urlConet.openStream();// new一个Ftp对象FTPUtil ftpUtil = new FTPUtil();// ftp放置文件路径String ftpPath = "xxx/xxx/xxx";// 文件名String fileName = "xxxx.jpg";boolean uploadFile = ftpUtil.uploadFile(ftpPath, inStream, fileName);System.out.println(uploadFile);}catch (Exception e){e.printStackTrace();}}}
package com.bayonet.action;import java.io.IOException;
import java.io.InputStream;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import com.bayonet.constant.Const;public class FTPUtil
{/*** Ftp 上传图片* * @param ftpPath*            ftp路径* @param inputStream*            输入流* @param fileName*            文件名* @return boolean* @throws Exception*             异常*/public boolean uploadFile(String ftpPath, InputStream inputStream, String fileName) throws Exception{boolean flag = false;Exception exp = new Exception();FTPClient ftpClient = new FTPClient();try{// 连接FTP服务器ftpClient.connect("FTP连接IP地址","FTP连接端口");// 登录FTP服务器ftpClient.login("FTP连接账号", "FTP连接密码");// 是否成功登录FTP服务器 230为登录成功int replyCode = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(replyCode)){return flag;}ftpClient.enterLocalPassiveMode();// 开启被动模式ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);boolean makeDir = makeDir(ftpClient, ftpPath);String printWorkingDirectory = ftpClient.printWorkingDirectory();System.out.println("获取当前目录:" + printWorkingDirectory);/** storeFile(String remote,InputStream local)抛出IOException 使用给定的名称在服务器上存储一个文件,并从给定的 InputStream 获取输入 * 参数: remote - 给远程文件的名称。 local - 从中读取文件的本地 InputStream。* 返回:如果成功完成,则为真,否则为假。*/ftpClient.storeFile(new String(fileName.getBytes(Const.GBK), Const.ISO), inputStream);// 通过发送 QUIT 命令注销 FTP 服务器ftpClient.logout();flag = true;}catch (Exception e){exp = e;e.printStackTrace();}finally{if (ftpClient.isConnected()){try{ftpClient.disconnect();}catch (IOException e){exp = e;throw exp;}}if (inputStream != null){inputStream.close();}}return flag;}/*** ftp创建多级目录(ftp只支持创建一级目录)* * @param ftpClient*            ftp连接* @param path*            文件路径* @return boolean*/public boolean makeDir(FTPClient ftpClient, String path){boolean makeDirectory = false;try{String[] split = path.split("/");for (String string : split){if (StringUtils.isEmpty(string)){continue;}/*** changeWorkingDirectory 更改 FTP 会话的当前工作目录。 * 返回:如果成功完成,则为真,否则为假*/if (!ftpClient.changeWorkingDirectory(string)){/*** makeDirectory 在当前目录(如果给定相对路径名)或指定位置(如果给定绝对路径名)的 FTP 服务器上创建一个新子目录 * 返回:如果成功完成,则为真,否则为假。*/makeDirectory = ftpClient.makeDirectory(string);/*** changeWorkingDirectory 更改 FTP 会话的当前工作目录。 * 返回: 如果成功完成,则为真,否则为假。*/ftpClient.changeWorkingDirectory(string);}else{makeDirectory = ftpClient.changeWorkingDirectory(string);}}}catch (Exception e){e.printStackTrace();}return makeDirectory;}}

代码看起来是不是感觉没问题?我在本地咋跑咋流畅,到了测试环境,死活跑不通。一直报java.io.FileNotFoundException: http://xxx.xxx.xx.xx/xxx/xxx/P.JPG这个错误,我是百思不得其解,在网上找了半天。发现网上的解决方案都不是很靠谱。后来发现我的图片里边有中文名称,我就试着把中文名称去掉,发现居然成功了。于是又到了疯狂设置编码格式的时刻,各种设置发现都不行。后来查看了apache日志才发现,要设置urlEncoder的编码格式为UTF-8.

解决方案:

/*
* java.net.URLEncoderAPI介绍
* 对字符串进行编码时,适用以下规则:
* 字母数字字符“ a”到“ z”、“ A”到“ Z”和“ 0”到“ 9”保持不变。
* 特殊字符“ .”、“ -”、“ *”和“ _”保持不变。
* 空格字符“  ”转换为加号“ +”。
* 所有其他字符都是不安全的,首先使用某种编码方案将其转换为一个或多个字节。然后每个字节由3个字符的字符串“ ”表* * 示,其中xy是字节的两位十六进制表示。推荐使用的编码方案是 UTF-8。但是,出于兼容性原因,如果未指定编码,则使* 用平台的默认编码。 %xy
*///根据自己的路径格式  把中文部分截取出来转换格式后,拼起来再放入URl 这样他就能获取到这个图片了
//注:URL的路径必须是http路径
String picPath = java.net.URLEncoder.encode(picPath, "UTF-8");
URL urlConet = new URL(picPath);

文章仅用作分享记录,如有不当之处,还望指正。

最近开通个人了微信公众号,以后将会定期分享工作学习过程中遇到的问题,欢迎关注与我一道成长交流~:

微信搜索: MYY668999程序猿爱篮球 即可上车。

使用Java输入流(InputStream)读取FTP服务器图片,并上传到另一台FTP服务器相关推荐

  1. php 上传本地图片到服务器上,PHP如何将图片文件上传到另外一台服务器上

    说,我有一个需求,就是一个临时功能.由于工作开发问题,我们有一个B项目,需要有一个商品添加的功能,涉及到添加商品内容,比如商品名字,商品描述,商品库存,商品图片等.后台商品添加的接口已经写完了,但是问 ...

  2. java代码实现多张图片/单张图片文件上传

    在项目中有这样的需求,有多个地方需要用到上传图片的功能,可以上传一张或多张照片.这时候自然想到了封装,来达到复用的目的.前后端分离开发,可以在上传文件后返回图片路径给前端,然后在最后整个需求完成后由前 ...

  3. java 图片分段上传_java实现分段读取文件并通过HTTP上传的方法

    本文实例讲述了java实现分段读取文件并通过HTTP上传的方法.分享给大家供大家参考.具体如下: 1.首先将文件分段,用RandomAccessFile 2.分段后将分出的内容上传到http URL ...

  4. java ftp 文件移动文件_通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等...

    记录一次对FTP服务器文件内容 通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等. 需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操 ...

  5. java 上传文件并读取_Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的 ...

  6. 写给大忙人看的 - Java中图片压缩上传至MinIO服务器(4)

    之前文章已经介绍了 MinIO 的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法 1.背景 最近客户总抱怨 APP 中图片显示较慢, 升级服务器带宽又没有多的预算.查看 ...

  7. java poi方式读取Excel的图片

    POM ​​​​ <!-- poi --> <dependency><groupId>cn.afterturn</groupId><artifac ...

  8. 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)

    解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下) 参考文章: (1)解决:百度编辑器UEditor,怎么将图片保存到图片 ...

  9. asp.net ftp上传文件到服务器,.net 文件上传到服务器上

    详解 Linux 下 SSH 远程文件传输命令 scp 3.将本地文件上传到服务器上 scp-P 2222/home/lnmp0.4.tar.gz root@www.vpser.net:/root/l ...

最新文章

  1. Apriori算法实例
  2. 面试官:this和super有什么区别?this能调用到父类吗?
  3. Mysql简介和Mysql优化查询的方法
  4. python 在线培训费用-在线Python编程培训哪家机构比较好?
  5. php删除数据库数据操作日志文件,MSSQL清空日志删除日志文件
  6. Linux下rpm、yum和源码三种安装方式详细介绍
  7. JS 数组 Array 对象详解 与 for...of 增强型迭代
  8. 将Banner美观的放置于博客首页上
  9. java ssh会议室管理系统(源码+文档)【源码分享】
  10. 日志:实现微信公众号自动问答机器人(待整理)
  11. GD32IAP升级(BootLoader)
  12. css做出京东登录界面
  13. 车内静谧性超越埃尔法?走进腾势D9身价上亿的NVH实验室
  14. Tiled map导入问题
  15. CSDN Blogger小工具
  16. 蓝牙芯片排行_8月TWS硅麦出货量排行榜TOP15
  17. 夏普电视的html接口,夏普电视投屏设置方法
  18. mobl:针对移动Web开发的“.NET研究”DSL
  19. 蓝色微立体图表合集4PPT模板
  20. 前端学习笔记之CSS3基础语法与盒模型(二)

热门文章

  1. 致九月:我们不会变老,我们只会变好
  2. c语言调用swf,Transform SWF
  3. 使用Google Elevation API获取海拔高度(java版)
  4. 并发编程——JUC并发大厂面试问题
  5. 百万年薪之间的对话(自由职业者访谈录)
  6. 2022年二级建造师《专业工程(水利)》每日一练考试真题及答案
  7. python入门需要什么基础知识_小学生Python入门基础知识有哪些
  8. 上周热点回顾(4.20-4.26)
  9. 布控球HDS-1300e布控球接入国标协议视频平台EasyGBS步骤介绍
  10. 详解 Flutter State 生命周期