最近搞linux ftp,测试的时候发现一个奇怪的问题,windows上显示正常的图片,上传到linux ftp上之后,图片严重失贞。如下图所示:
上传所用java代码如下:
package com.cpsdna.laso.util; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.*; import com.cpsdna.laso.webapp.dict.Util; import com.xinhi.pub.PubUtils; public class FTPTest { private static String host="192.168.1.94"; private static int port=21; private static String username="ftpuser"; private static String password="123456"; public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); try{ ftpClient.connect(host, port); ftpClient.login(username, password); ftpClient.changeWorkingDirectory("/hello/"); //列出文件列表 FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if(ff.isDirectory()){ System.out.print("Directory "); }else if(ff.isFile()){ System.out.print("File "); } System.out.println(new String(ff.getName().getBytes("iso8859-1"), "UTF-8")); } String baseDir="F:\\file\\"; File srcFile = new File(baseDir + "rerew.jpg"); String filename="rerew.jpg"; int lastIndex = filename.lastIndexOf("."); filename = filename.substring(0, lastIndex) + "_" + System.currentTimeMillis() + filename.substring(lastIndex); InputStream input = new FileInputStream(srcFile); //把file直接转换成流,然后直接上传 ftpClient.storeFile(new String(filename.getBytes("GBK"), "iso-8859-1"), input); }catch(Exception e){ }finally{ if (ftpClient != null) { try { ftpClient.logout(); } catch (IOException ioe) { Log.error("error", ioe); } } if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { Log.error("error", ioe); } } } } }
问题出在哪里呢?查看其它程序中的代码,发现,少了这一句:
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
也就是上传文件传输类型问题设置。加上之后果然就ok了。
可为什么呢?于是Google,发现里面居然有很有趣的故事,分享给大家:
“回车和换行关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打 开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
Dos和windows采用回车+换行CR/LF表示下一行,
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)则采用回车符CR表示下一行.
ASCII 模式和BINARY模式的区别是回车换行的处理,binary模式不对数据进行任何处理,asci模式将回车换行转换为本机的回车字符,比如Unix下是\n,Windows下是\r\n,Mac下是\r”
所以,FTP可用多种格式传输文件,通常由系统决定,大多数系统(包括UNIX系统)只有两种模式:文本模式和二进制模式。文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。
一般来说: 如果你用错误的模式传输你的图片,你将会无法看到图片,看到的会是乱码。 如果你用错误模式上传CGI脚本,那么就将无法运行你的脚本,会看到类似Server 500 Error的出错信息。
所以你必须使用正确的模式,图片和执行文件必须用BINARY模式,CGI脚本和普通HTML文件用ASCII模式上传.
ASCII 和BINARY模式区别:
用HTML 和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错。
BINARY模式用来传送可执行文件,压缩文件,和图片文件。
如果你用ASCII模式传,会显示一堆乱码,你必须重新用BINARY模式传。
相关推荐
### FTP的ASCII模式和Binary模式的区别详解 在深入探讨FTP(File Transfer Protocol)的ASCII模式与Binary模式之前,我们先来简要回顾一下FTP的基本功能。FTP是一种用于在网络上进行文件传输的标准协议,它允许用户...
FTP 协议基于客户机/服务器模式,即用户通过客户端程序连接到远程主机上的 FTP 服务器,从而进行文件的上传或下载。 #### Java FTP 客户端编程: Java 提供了多种方式来实现 FTP 客户端的功能,其中包括使用第三方...
1. **数据传输模式**:FTP支持ASCII和Binary两种数据传输模式。ASCII模式适用于文本文件的传输,而Binary模式则适用于所有类型的二进制文件。 2. **目录管理**:FTP提供了对远程目录的查看(ls)、切换(cd)等功能...
在Java编程语言中,FTP(File Transfer Protocol)文件上传和下载是常见的网络操作,用于在本地计算机和远程服务器之间交换文件。以下将详细介绍如何使用Java实现FTP文件上传和下载的步骤,以及涉及到的关键知识点。...
3. **使用Apache Commons Net**:Apache Commons Net提供了`FTPClient`类,可以用来创建FTP连接,登录服务器,设置传输模式(如ASCII或二进制),以及上传和下载文件。首先,你需要创建一个`FTPClient`实例,然后...
在本文中,我们将深入探讨Java FTP上传、下载以及断点续传的核心概念和实现方法。 1. FTP基本原理: FTP是一种基于TCP/IP协议的应用层协议,主要用于在客户端和服务器之间传输文件。它定义了两组命令和响应,一组...
在Java编程语言中,FTP(File Transfer Protocol)上传是一个常见的任务,用于在本地计算机和远程服务器之间传输文件。本文将详细介绍如何使用Java实现FTP上传功能,并探讨相关知识点。 首先,要进行FTP操作,我们...
在Java分布式项目中,涉及到客户端上传图片到FTP服务器并由Nginx提供HTTP服务进行图片下载,这是一个典型的文件传输和Web服务集成的场景。这里主要涉及三个关键知识点:Java FTP客户端编程、Nginx服务器配置以及Java...
8. **处理结果和清理**:无论上传还是下载,完成后都要记得关闭流和断开FTP连接。 ```java inputStream.close(); localFile.close(); ftpClient.logout(); ftpClient.disconnect(); ``` 以上就是使用Java和...
Java FTP服务器文件上传下载是Java开发中常见的网络编程任务,主要涉及到FTP(File Transfer Protocol)协议的应用,用于在客户端和服务器之间传输文件。本教程将详细讲解如何使用Java实现FTP服务器的文件上传、下载...
- 选择ASCII或二进制模式,取决于传输的文件类型:`ftp.setFileType(FTP.BINARY_FILE_TYPE);` 3. **文件上传**: - 更改工作目录:`ftp.changeWorkingDirectory(directory);` - 本地文件读取:`FileInputStream ...
本文介绍了如何使用 Java 实现 FTP 服务器上的大批量文件的上传和下载,处理大文件的上传和下载。通过 Java 现有的可用的库来编写 FTP 客户端代码,并开发成 Applet 控件,做成基于 Web 的批量、大文件的上传下载...
Java FTP上传是一个在Java编程环境中实现文件传输协议(FTP)的关键技术,用于在本地计算机与远程服务器之间交换文件。FTP上传功能通常包括断点续传和进度显示,这对于大型文件的传输尤其重要,因为它们允许在中断后...
FTP有两种传输模式,二进制(BINARY)和文本(ASCII)。大多数文件应使用二进制模式。 ```java ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ``` 4. **创建本地文件输入流**: 为了上传文件,我们需要一个...
然后,为了实现大文件的分块上传,我们可以使用`FTPClient.setFileType(FTP.BINARY_FILE_TYPE)`设定为二进制模式,因为大文件通常是非文本文件。接着,我们需要计算文件的总大小,并将其分成若干个块进行上传,这样...
本文将详细讨论如何使用Java连接FTP(File Transfer Protocol)服务器,进行文件的上传、下载、删除以及复制等操作。 首先,Java通过`java.net`和`javax.net`包提供了FTP客户端的功能。主要依赖于`java.net....
总之,Java FTP客户端源代码提供了一个平台,让你可以利用Java的强大力量来实现文件的上传、下载和管理。通过学习和实践,你将能够掌握FTP通信的核心概念,并将这些知识应用到你的项目中,提升你的开发技能。
### Java上传文件到FTP知识点详解 #### 一、概述 在现代软件开发中,文件传输是一项常见的需求。其中,FTP(文件传输协议)是最常用的一种文件传输方式之一。本篇文章将详细阐述如何利用Java编程语言实现本地文件...
- 转换为二进制模式:`ftpClient.setFileType(FTP.BINARY_FILE_TYPE);` - 打开本地输入流:`FileInputStream fis = new FileInputStream(localFilePath);` - 使用`FTPClient`的`storeFile()`方法上传文件:`...
Java实现简单在线播放器——支持优酷和土豆 。原理很简单。纠结的是要知道土豆跟优酷是的视频播放需要哪些参数。更多请参看http://blog.csdn.net/cannel_2020/article/details/7953257 或 者...