我写了一个简单的代码,使用以下连接字符串从FTP服务器下载文件:
URL url = new URL("ftp://test:pass@182.71.224.200/sample.txt;type=i");
URLConnection urlc = url.openConnection();
但是当我尝试从上面的连接中读取内容并在我的本地驱动器上写入时,我只获得了61KB。当我打开sample.txt
时,它具有以下内容:
06-16-2011 02:47PM 1228317425 sample.txt
但FTP中sample.txt的原始大小为1.14GB。
urlc.getContentLength()
为我退回-1
。
这是我的整个代码
public void download( String ftpServer, String user, String password,
String fileName, File destination ) throws MalformedURLException,
IOException
{
if (ftpServer != null && fileName != null && destination != null)
{
StringBuffer sb = new StringBuffer( "ftp://" );
// check for authentication else assume its anonymous access.
if (user != null && password != null)
{
sb.append( user );
sb.append( ':' );
sb.append( password );
sb.append( '@' );
}
sb.append( ftpServer );
sb.append( '/' );
sb.append( fileName );
/*
* type ==> a=ASCII mode, i=image (binary) mode, d= file directory
* listing
*/
sb.append( ";type=i" );
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
System.out.println(sb);
try
{
URL url = new URL( sb.toString() );
URLConnection urlc = url.openConnection();
System.out.println(urlc.getContentType());
System.out.println(urlc.toString());
System.out.println(urlc.getContentLength());
bis = new BufferedInputStream( urlc.getInputStream() );
bos = new BufferedOutputStream( new FileOutputStream("D://FTP/"+
destination.getName() ) );
int i;
while ((i = bis.read()) != -1)
{
bos.write( i );
}
}
finally
{
if (bis != null)
try
{
bis.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
if (bos != null)
try
{
bos.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
else
{
System.out.println( "Input not available" );
}
}
答案 0 :(得分:2)
您需要打开连接并开始流式传输结果,例如
URL url = new URL("ftp://test:pass@182.71.224.200/sample.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
etc. etc.
你做到了吗? JDK的基本支持仅限于流式传输数据。您可能希望查看Java FTP客户端,它允许您与FTP协议进行更丰富的交互。我在这方面没有太多经验,但Apache Commons Net就是这样一个例子。通过这种方式,您可以将文件读作org.apache.commons.net.ftp.FtpFile
对象,它具有文件大小的getter。
BTW:如果找不到名为“content-length”的标题,那么getContentLength()
调用的-1就是默认值。所以我认为在你的情况下,因为这是FTP方法是不相关的。这增加了尝试使用专用FTP库的重量。
答案 1 :(得分:1)
无需重新发明轮子。我建议使用FTP4J,我在几个项目中用于文件上传/下载。 http://www.sauronsoftware.it/projects/ftp4j/。我认为图书馆应该能够为你处理这些问题。
答案 2 :(得分:0)
您可能想要使用现有的库而不是自己编辑库,请尝试Apache Commons Net。