当前位置:编程学习 > JAVA >>

求高手解答URLConnection实现远程FTP文件下载,文件名为中文名(如:测试.jpg)时,报错求解?

URLConnection实现远程FTP文件下载,文件名为中文名(如:测试.jpg)时,报错求解.说明下载英文名文件时是正常的,迄今为止没有发现正确的解决方案.求高手解答
Exception in thread "main" java.util.concurrent.ExecutionException: java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at Downloader.main(Downloader.java:200)
Caused by: java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at Downloader.call(Downloader.java:73)
at Downloader.call(Downloader.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


代码如下:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
/**
 * 使用URLConnection下载文件或图片并保存到本地。
 * 
 * @author
 */
public class URLConnectionDownloader {
  public static void main(String[] args) throws Exception {
    download("ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/无标题.bmp;type=i", "无标题.bmp");
  }
  /**
   * 下载文件到本地
   * 
   * @param urlString
   *          被下载的文件地址
   * @param filename
   *          本地文件名
   * @throws Exception
   *           各种异常
   */
  public static void download(String urlString, String filename) throws Exception {
    // 构造URL
    URL url = new URL(urlString);
    // 打开连接
    URLConnection con = url.openConnection();
    // 输入流
    InputStream is = con.getInputStream();
    // 1K的数据缓冲
    byte[] bs = new byte[1024];
    // 读取到的数据长度
    int len;
    // 输出的文件流
    OutputStream os = new FileOutputStream(filename);
    // 开始读取
    while ((len = is.read(bs)) != -1) {
      os.write(bs, 0, len);
    }
    // 完毕,关闭所有链接
    os.close();
    is.close();
  }
}  --------------------编程问答-------------------- 这类问题肯定又是编码问题了?

远程端的系统是什么系统?用的是什么字符集?
--------------------编程问答-------------------- Serv-U建立的一个FTP --------------------编程问答-------------------- 期待高手出现.... --------------------编程问答-------------------- 一样啊,高手们快来解决吧 --------------------编程问答-------------------- 可能字符集的问题,看一下download方法,传过来的参数filename是什么东东,是不是你要的。
如果不是,就要用字符集转一下。
默认可能是iso8859-1
String fn = new String(filename.getBytes("iso8859-1"), "utf-8"); 
试试 --------------------编程问答-------------------- 这个试过不行的,代码已经附在最上面,求高手解答,最好能在上面的代码上进行修改,程序是正确的,只是只能下载英文不能下载中文名文件. --------------------编程问答-------------------- 没有高手能解决的了吗?一个高手挑战下 --------------------编程问答-------------------- 有没有人帮解答下啊,多谢 --------------------编程问答-------------------- 对中文路径进行URLEncoder编码试试

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%CE%DE%B1%EA%CC%
E2.bmp;type=i

--------------------编程问答-------------------- UTF-8

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%E6%97%A0%E6%A0%87%E9%A2%98.bmp;type=i --------------------编程问答--------------------
引用 9 楼  的回复:
对中文路径进行URLEncoder编码试试

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%CE%DE%B1%EA%CC%
E2.bmp;type=i


这个已经测试过,报错如下:
Exception in thread "main" java.lang.IllegalArgumentException
at sun.net.www.ParseUtil.decode(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.decodePath(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:33)
at URLConnectionDownloader.main(URLConnectionDownloader.java:15) --------------------编程问答--------------------
引用 10 楼  的回复:
UTF-8

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%E6%97%A0%E6%A0%87%E9%A2%98.bmp;type=i


这个也已经测试过,报错如下:

Exception in thread "main" java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:33)
at URLConnectionDownloader.main(URLConnectionDownloader.java:15) --------------------编程问答-------------------- 还有高招吗?望高手指点,多谢 --------------------编程问答-------------------- 肯定是乱码了。把中文明编码成Unicode或者把字符集换成和系统一样的 --------------------编程问答--------------------
引用 14 楼  的回复:
肯定是乱码了。把中文明编码成Unicode或者把字符集换成和系统一样的



上面有完整的代码,大家都可以运行下试试. --------------------编程问答-------------------- 因为我在用serv-u做的FTP服务器,现在有一个办法,是在serv-u的"限制和设置"-"为域配置高级FTP命令设置和行为"-"全局属性"-"高级选项"将"对所有已收发的路径和文件名使用utf-8编码"这一项取消掉,运行上面的代码就可以直接下载中文名字的文件了.但我实际使用的不是serv-u服务器,编码是utf-8,所以我需要在代码里实现,而不是去改服务器的配置,不知道要如何来实现,我试过
new String("无标题".getBytes("iso8859-1"),"utf-8"),但是很奇怪,虽然没有报错,可是下载下来的文件打开一看,图片看不到,1M的文件下载下来只有17k.
如果用new String("无标题".getBytes("gbk"),"utf-8"),则直接报以下错误
Exception in thread "main" sun.net.ftp.FtpProtocolException: 501 Syntax error in parameters or arguments.

at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)
at sun.net.ftp.FtpClient.get(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:35)
at URLConnectionDownloader.main(URLConnectionDownloader.java:17)

请问要如何加以处理,谢谢 --------------------编程问答-------------------- 这个问题是JDK版本的问题,只要ftp的URL访问中有中文的目录或者文件名就不行!转码会出错,升级JDK就不会了!
补充:Java ,  Java相关
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,