Apache ftp tools 图片下载支持中文

写道

Apache Commom net:
1) 递归path,调用changeWorkingDirectory改变工作目录并验证是否存在
 然后直接调用retrieveFileStream(filename),filename不用带路径,path经过编码后,filename带全路径存在问题;
2)编码方式统一用new String(filename.getBytes("UTF-8"),"iso-8859-1")
3)ftpClient.getSystemType()获取FTP服务器操作系统,动态设置编码

 

写道

问题:1)原下载图片时直接返回InputStream,然后在业务代码位置获取数据时阻塞无响应,错误信息:toString() unavailable - no suspended threads

对于网络流InputStream available经常返回0,即网络存在延时,方法执行完后立刻关闭连接,数据还未接收完或正在接收中时被关闭,倒致InputStream read方法阻塞。

 

public static InputStream getBytes(URL url){
		FTPClient ftpClient = null;
		InputStream inputStream = null;
		String filename = null;
		String pathname = null;
		String fullpath = null;
		String host = url.getHost();
		String user = "anonymous";
		String pass ="";
		int port = url.getPort();
		String path = url.getPath();
		String userInfo = url.getUserInfo();
		try {
			if (userInfo != null) { // get the user and password
				int delimiter = userInfo.indexOf(':');
				if (delimiter != -1) {
					user = userInfo.substring(0, delimiter++);
					pass = userInfo.substring(delimiter);
				}
			}
			ftpClient = getClient(host, user, pass, port);
			if(!path.endsWith("/")){
				int i = path.lastIndexOf('/');
				if(i>0){
					filename=path.substring(i+1,path.length());
					pathname=path.substring(0,i);
				}else{
					filename=path;
					pathname=null;
				}
			} else {
				pathname=path.substring(0,path.length()-1);
				filename=null;
			}
			if(pathname!=null){
				fullpath=pathname+"/"+(filename!=null?filename:"");
			}else{
				fullpath = filename;
			}
			// 编码后的pathname
			StringBuffer sb = new StringBuffer();			
			ftpClient.setControlEncoding("UTF-8");
			String encodeFileName = new String(filename.getBytes("UTF-8"),FTP_ENCODE);
			StringTokenizer token = new StringTokenizer(path,"/");
			long a = System.currentTimeMillis();
			while (token.hasMoreTokens()){
				String fold = token.nextToken();
				// 中文编码
				String encodeFold = new String(fold.getBytes("UTF-8"),FTP_ENCODE);
				boolean flag = ftpClient.changeWorkingDirectory(encodeFold);
				if(!flag){
					System.out.println("目录不存在:"+fold);
					System.out.println("指定的目录不存在或ftp无法打开,路径为:"+pathname);
					break;
				}
				sb.append(encodeFold);
				if(token.hasMoreTokens()){
					sb.append("/");
				} else {
					sb.append("/");
					sb.append(encodeFileName);
				}
			}
			long b = System.currentTimeMillis();
			inputStream=ftpClient.retrieveFileStream(encodeFileName);
		} catch (FTPConnectionClosedException e) {
			System.err.println("Server closed connection.");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
		}
		return inputStream;
	}

 

写道

数据获取完后,再关闭连接。升级后正常

 

package com.sunshine.app.util.ftp;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.StringTokenizer;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.ftp.FTPReply;

public abstract class FtpTools {

	private static String FTP_ENCODE = "iso-8859-1";
	
	private static byte[] EMPTY_BYTE = new byte[0];
	
	public static FTPClient getClient(String host, String user, String pass, int port){
		FTPClient ftpClient = null;
		ftpClient = new FTPClient();
		try {
			ftpClient.connect(host, port);
			int defaultTimeout = 30 * 60 * 1000;
			ftpClient.setConnectTimeout(3 * 1000);
			ftpClient.setControlKeepAliveTimeout(defaultTimeout);
			ftpClient.setControlKeepAliveReplyTimeout(defaultTimeout);			
			int reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP server refused connection.");
			}
		} catch (IOException e) {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
			System.err.println("Could not connect to server.");
			e.printStackTrace();
		}
		try
        {
            if (!ftpClient.login(user, pass)){
                ftpClient.logout();
            }
            System.out.println("Remote system is " + ftpClient.getSystemType());
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);        
            // Use passive mode as default because most of us are
            // behind firewalls these days.
            //ftpClient.enterLocalActiveMode();
            ftpClient.enterLocalPassiveMode();
            ftpClient.setUseEPSVwithIPv4(false);
        }catch(FTPConnectionClosedException e){
            System.err.println("Server closed connection.");
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
		} finally {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
		}
		return ftpClient;
	}
	
	public static byte[] getBytes(URL url){
		FTPClient ftpClient = null;
		InputStream inputStream = null;
		String filename = null;
		String pathname = null;
		String fullpath = null;
		String host = url.getHost();
		String user = "anonymous";
		String pass ="";
		int port = url.getPort();
		String path = url.getPath();
		String userInfo = url.getUserInfo();
		try {
			if (userInfo != null) { // get the user and password
				int delimiter = userInfo.indexOf(':');
				if (delimiter != -1) {
					user = userInfo.substring(0, delimiter++);
					pass = userInfo.substring(delimiter);
				}
			}
			ftpClient = getClient(host, user, pass, port);
			if(!path.endsWith("/")){
				int i = path.lastIndexOf('/');
				if(i>0){
					filename=path.substring(i+1,path.length());
					pathname=path.substring(0,i);
				}else{
					filename=path;
					pathname=null;
				}
			} else {
				pathname=path.substring(0,path.length()-1);
				filename=null;
			}
			if(pathname!=null){
				fullpath=pathname+"/"+(filename!=null?filename:"");
			}else{
				fullpath = filename;
			}
			// 编码后的pathname
			StringBuffer sb = new StringBuffer();			
			ftpClient.setControlEncoding("UTF-8");
			String encodeFileName = new String(filename.getBytes("UTF-8"),FTP_ENCODE);
			StringTokenizer token = new StringTokenizer(path,"/");
			long a = System.currentTimeMillis();
			while (token.hasMoreTokens()){
				String fold = token.nextToken();
				// 中文编码
				String encodeFold = new String(fold.getBytes("UTF-8"),FTP_ENCODE);
				boolean flag = ftpClient.changeWorkingDirectory(encodeFold);
				if(!flag){
					System.out.println("目录不存在:"+fold);
					System.out.println("指定的目录不存在或ftp无法打开,路径为:"+pathname);
					break;
				}
				sb.append(encodeFold);
				if(token.hasMoreTokens()){
					sb.append("/");
				} else {
					sb.append("/");
					sb.append(encodeFileName);
				}
			}
			long b = System.currentTimeMillis();
			inputStream=ftpClient.retrieveFileStream(encodeFileName);
			long c = System.currentTimeMillis();
			System.out.println("CD--"+(b-a) + " RF--" + (c-b));
			if(inputStream == null)
				return EMPTY_BYTE;
			return transferToByteArray(inputStream);
		} catch (FTPConnectionClosedException e) {
			System.err.println("Server closed connection.");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
		}
		return EMPTY_BYTE;
	}
	
	public static byte[] transferToByteArray(InputStream input){
		BufferedInputStream bi = null;
		ByteArrayOutputStream barray = null;
		try {
			byte[] buffer = new byte[1024];
			bi = new BufferedInputStream(input); 
			barray = new ByteArrayOutputStream();
			int len = 0;
			while((len=bi.read(buffer))!=-1){
				barray.write(buffer, 0, len);
			}
			barray.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				if(barray != null)
					barray.close();
				if(bi != null)
					bi.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return barray.toByteArray();
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值