设为首页 收藏本站
查看: 1708|回复: 0

[经验分享] java ftp上传图片失贞——ASCII 和BINARY模式区别

[复制链接]

尚未签到

发表于 2016-6-11 01:11:55 | 显示全部楼层 |阅读模式
  最近搞linux ftp,测试的时候发现一个奇怪的问题,windows上显示正常的图片,上传到linux ftp上之后,图片严重失贞。如下图所示:
  
DSC0000.jpg
  
  
DSC0001.jpg
  
  上传所用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\nMac下是\r
  
  所以,FTP可用多种格式传输文件,通常由系统决定,大多数系统(包括UNIX系统)只有两种模式:文本模式和二进制模式。文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。
 
  一般来说: 如果你用错误的模式传输你的图片,你将会无法看到图片,看到的会是乱码。 如果你用错误模式上传CGI脚本,那么就将无法运行你的脚本,会看到类似Server 500 Error的出错信息。
 
  所以你必须使用正确的模式,图片和执行文件必须用BINARY模式,CGI脚本和普通HTML文件用ASCII模式上传.
 
  ASCII BINARY模式区别:
 
  用HTML 和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错。
 
  BINARY模式用来传送可执行文件,压缩文件,和图片文件。
 
  如果你用ASCII模式传,会显示一堆乱码,你必须重新用BINARY模式传。
  
  
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228741-1-1.html 上篇帖子: windows2008利用serv-u14.0.0.6架设FTP服务器的方法 下篇帖子: 在RHEL上安裝設置常用服務(ftp,smb,ror+nginx)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表