求高手解答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 --------------------编程问答--------------------
这个已经测试过,报错如下:
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) --------------------编程问答--------------------
这个也已经测试过,报错如下:
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或者把字符集换成和系统一样的 --------------------编程问答--------------------
上面有完整的代码,大家都可以运行下试试. --------------------编程问答-------------------- 因为我在用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相关