`
yangyangmyself
  • 浏览: 233794 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

FtpURLConnection 图片下载编码问题

    博客分类:
  • Java
阅读更多
写道
问题:
1)Web项目中下载图片,存在下载不全,丢失部份图片
2)FTP路径存在中文图片名称或中文路径
3)直接运行Main方法可以下载图片,放在Web项目中下载失败,错误异常"FileNotFoundException"

 

写道
为什么直接运行Main方法可以成功下载?

Myeclipse/eclipse 右击类--->Run As-->Run Configuration,查看默认编码,直接运行Main方法,JVM启动时,将类文件默认编码设置-Dfile.encoding=UTF-8(Default VM Arguments)

什么时候设置GBK还是UTF-8,依据是什么?

默认情况FTP服务器所在服务有关,Windowns采用GBK,Linux采用UTF-8编码

 

 

写道
为什么Web项目中,在执行下载前通过System.setProperties("file.encoding","UTF-8")设置編码,仍然提示FileNotFoundException即编码问影响,设置不起作用?

JVM 参数存在缓存,JVM启动时已加载至缓存,FtpURLConnection从缓存获取,后续通过System改变不启作用,Myeclipse/eclipse:windows-->preferences-->installed JREs-->Edit

 

 

 

写道
Tomcat 启动时或运行Jar时设置-Dfile.encoding=UTF-8
FtpURLConnection用不好到处是坑,直接改JVM编码来适配FTP服务器,应用存在风险,建议下载图采用第三方工具如,Apache common net,附上FtpURLConnection getInputStream源码

 

public InputStream More ...getInputStream() throws IOException {
        if (!connected) {
            connect();
        }

        if (http != null)
            return http.getInputStream();

        if (os != null)
            throw new IOException("Already opened for output");

        if (is != null) {
            return is;
        }

        MessageHeader msgh = new MessageHeader();

        try {
            decodePath(url.getPath());
            if (filename == null || type == DIR) {
                ftp.ascii();
                cd(pathname);
                if (filename == null)
                    is = new FtpInputStream(ftp, ftp.list());
                else
                    is = new FtpInputStream(ftp, ftp.nameList(filename));
            } else {
                if (type == ASCII)
                    ftp.ascii();
                else
                    ftp.binary();
                cd(pathname);
                is = new FtpInputStream(ftp, ftp.get(filename));
            }

            /* Try to get the size of the file in bytes.  If that is
               successful, then create a MeteredStream. */
            try {
                String response = ftp.getResponseString();
                int offset;

                if ((offset = response.indexOf(" bytes)")) != -1) {
                    int i = offset;
                    int c;

                    while (--i >= 0 && ((c = response.charAt(i)) >= '0'
                                        && c <= '9'))
                        ;
                    i = Integer.parseInt(response.substring(i + 1, offset));
                    msgh.add("content-length", ""+i);
                    if (i > 0) {

                        // Wrap input stream with MeteredStream to ensure read() will always return -1
                        // at expected length.

                        // Check if URL should be metered
                        boolean meteredInput = ProgressMonitor.getDefault().shouldMeterInput(url, "GET");
                        ProgressSource pi = null;

                        if (meteredInput)   {
                            pi = new ProgressSource(url, "GET", i);
                            pi.beginTracking();
                        }

                        is = new MeteredStream(is, pi, i);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                /* do nothing, since all we were doing was trying to
                   get the size in bytes of the file */
            }

            String type = guessContentTypeFromName(fullpath);
            if (type == null && is.markSupported()) {
                type = guessContentTypeFromStream(is);
            }
            if (type != null) {
                msgh.add("content-type", type);
            }
        } catch (FileNotFoundException e) {
            try {
                cd(fullpath);
                /* if that worked, then make a directory listing
                   and build an html stream with all the files in
                   the directory */
                ftp.ascii();

                is = new FtpInputStream(ftp, ftp.list());
                msgh.add("content-type", "text/plain");
            } catch (IOException ex) {
                throw new FileNotFoundException(fullpath);
            }
        }
        setProperties(msgh);
        return is;
}

 

 

  • 大小: 77.5 KB
  • 大小: 65.7 KB
分享到:
评论

相关推荐

    ftp网络下载

    * 从网络Url中下载文件 * * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadByUrl(String urlStr, String fileName, String savePath) throws ...

    文件下载(FTP)

    源码实现FTP文件下载时,需要注意安全性和效率问题。为了保证安全,应使用FTPS(FTP over SSL/TLS)或SFTP(SSH File Transfer Protocol)进行加密传输,防止数据在传输过程中被窃取。此外,合理设置超时、重试机制...

    简单java下载程序

    Java下载程序是一个基础的软件开发任务,主要用于从服务器获取文件并保存到本地计算机。在这个“简单java下载程序”中,我们可以看到它当前专注于HTTP协议,这是互联网上最常用的通信协议之一,用于从Web服务器传输...

    ftp-for-java.zip_FTP上传乱_site:www.pudn.com

    此外,如果上传的文件是文本文件,确保文件本身也是以正确的编码(如UTF-8)保存的,否则即使在传输过程中解决了编码问题,文件内容仍然可能出现乱码。 总结,Java中的FTP上传功能可以通过Apache Commons Net等库...

    ftp上传下载java代码

    1. Java内置的FTP支持:Java的标准库`java.net.FTPURLConnection`提供了对FTP的基本支持,但它的API相对简单,功能有限,不适用于复杂的FTP操作。 2. 第三方库:Apache Commons Net库是Java中广泛使用的FTP客户端库...

    ftp上传下载文件及文件夹

    使用 JDK 的 `FTPURLConnection` 类,上传文件的流程与下载类似,只是使用 `FTPURLConnection` 的 `setDoOutput(true)` 开启输出,然后通过 `OutputStream` 写入文件数据: ```java import java.io.OutputStream; ...

    javaFTP上传下载

    Java FTP(File Transfer Protocol)是Java编程中用于与FTP服务器交互的一种技术,它允许程序员编写应用程序来上传、下载文件,管理远程目录等。在Java中,我们通常使用`java.net.FTPURLConnection`类或者第三方库如...

    FTP.zip_FTP 下载_ftp下载

    5. **断点续传**:FTP客户端支持断点续传功能,如果下载过程中因网络问题中断,可以记录当前下载的位置,在恢复连接后继续从该位置下载,无需重新开始。 6. **匿名FTP访问**:一些FTP服务器允许匿名用户访问,用户...

    真正完整的FTP上传与下载代码

    在PB9中实现FTP功能,开发者通常会使用内置的.NET或Java支持来调用相关的FTP类库,例如System.Net.FtpClient(.NET Framework)或java.net.URL、java.net.FTPURLConnection(Java)。这些类库提供了丰富的API,可以...

    java 连接 FTP 文件操作(上传,下载,删除,复制

    主要依赖于`java.net.FTPURLConnection`类来实现FTP连接。但需要注意的是,这个类的功能相对有限,因此在实际开发中,我们通常会使用第三方库,如Apache的Commons Net库,它提供了更强大且易于使用的FTP功能。 **...

    java支持ftp下载,并简单实现过滤

    首先,Java提供了`java.net.FTPURLConnection`类来处理FTP连接和文件操作。然而,这个类并不直观,因此在实际开发中,我们通常会使用第三方库,如Apache Commons Net库。Apache Commons Net提供了一个更友好的API,...

    ftp client applet

    然而,由于Java Applet的安全限制,直接使用`FTPURLConnection`在Applet中进行FTP操作可能会遇到权限问题,因此开发者通常会使用第三方库,如Apache Commons Net,它提供了更强大、更灵活的FTP客户端支持。...

    java应用ftp操作文件

    2. **Java标准库中的FTP支持**:Java标准库(JDK)提供`java.net.FTPURLConnection`类,用于通过URL进行FTP操作。然而,这个类的API相对简单,且不支持FTP的一些高级特性,如主动模式、被动模式、SSL/TLS安全连接等...

    ftpUtils.rar

    Java FTP库提供了与FTP服务器交互的能力,使得开发人员可以在Java应用程序中实现文件的上传和下载功能。在"ftpUtils.rar"这个压缩包中,我们很可能是找到了一个Java FTP工具类或库,用于简化FTP操作。 在Java中,最...

    Javaftp 客户端

    3. **错误处理**:编写健壮的代码,处理可能的网络中断、文件不存在等问题。 在实际项目中,JavaFTP客户端通常会封装成一个易于使用的类或服务,以供其他模块调用。例如,`JMyFtpClient`可能是一个自定义的FTP...

    Java源代码:FTP功能FtpApplet

    2. **Java FTP客户端编程**:在FtpApplet.java中,开发者会使用Java的`java.net.FTPURLConnection`或`java.io.FTPClient`类来实现FTP客户端功能。这些类提供了连接到FTP服务器、登录、改变目录、上传和下载文件等...

    java实现访问ftp服务器 显示所有文件列表

    Java作为多平台编程的强大语言,提供了丰富的API来实现FTP客户端的功能,包括连接FTP服务器、浏览文件列表以及进行文件上传和下载等操作。本篇将详细介绍如何使用Java通过Socket编程访问FTP服务器并显示所有文件列表...

    基于Java的实现的FTP连接与数据浏览程序.zip

    1. **Java FTP库**: Java标准库提供了一个名为`java.net.FTPURLConnection`的类,但它的功能相对有限。因此,开发者通常会选择第三方库如Apache Commons Net或JSch来增强FTP功能。Apache Commons Net提供了一个完整...

    FTP工具(jdk1.6版).rar

    FTP支持两种工作模式:主动模式(Port)和被动模式(Passive),其中被动模式常用于解决防火墙问题。 2. Java FTP编程: 在Java中,我们可以使用`java.net.Socket`类来建立与FTP服务器的连接,但更常见的是使用`...

Global site tag (gtag.js) - Google Analytics