使用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 urlConet = new URL("http://xxx.xxx.xx.xx/xxx/xxx/P.JPG");
HttpURLConnection con = (HttpURLConnection) urlConet.openConnection();
con.setRequestMethod("GET");
con.setConnectTimeout(6 * 1000);
inStream = con.getInputStream();
String pathName = "D://xxx.JPG";
File file = new File(pathName);
if (!file.exists())
{
file.mkdirs();
}
outStream = new FileOutputStream(file);
byte[] b = new byte[1024];
while ((inStream.read(b)) != -1)
{
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 urlConet = new URL("http://xxx.xxx.xx.xx/xxx/xxx/P.JPG");
inStream = urlConet.openStream();
FTPUtil ftpUtil = new FTPUtil();
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
{
public boolean uploadFile(String ftpPath, InputStream inputStream, String fileName) throws Exception
{
boolean flag = false;
Exception exp = new Exception();
FTPClient ftpClient = new FTPClient();
try
{
ftpClient.connect("FTP连接IP地址","FTP连接端口");
ftpClient.login("FTP连接账号", "FTP连接密码");
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);
ftpClient.storeFile(new String(fileName.getBytes(Const.GBK), Const.ISO), inputStream);
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;
}
public boolean makeDir(FTPClient ftpClient, String path)
{
boolean makeDirectory = false;
try
{
String[] split = path.split("/");
for (String string : split)
{
if (StringUtils.isEmpty(string))
{
continue;
}
if (!ftpClient.changeWorkingDirectory(string))
{
makeDirectory = ftpClient.makeDirectory(string);
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.
解决方案:
String picPath = java.net.URLEncoder.encode(picPath, "UTF-8");
URL urlConet = new URL(picPath);
文章仅用作分享记录,如有不当之处,还望指正。
最近开通个人了微信公众号,以后将会定期分享工作学习过程中遇到的问题,欢迎关注与我一道成长交流~:
微信搜索: MYY668999
或 程序猿爱篮球
即可上车。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)