FTP服务器与图片上传

将图片上传到FTP服务器

转载自:https://blog.csdn.net/binggetong/article/details/78765053
<div class="article-info-box">
    <div class="article-bar-top d-flex">
                                            <span class="time">2017年12月10日 15:51:07</span>
        <div class="float-right">
            <span class="read-count">阅读数:332</span>
                                        </div>
    </div>
</div>
<article>
    <div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">


【FTP服务器】


        ♦ FTP是什么?


        FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。同时,他也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有的这些应用程序都遵循同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念,下载和上传,下载就是从远程主机拷贝文件至自己的计算机上,上传文件就是将文件从自己的计算机中拷贝到远程主机上。


        ♦ FTP服务器是什么?

       

         简单的说,支持FTP协议的服务器就是FTP服务器。FTP是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。

       

         ♦ 匿名FTP

          

             使用FTP时必须首先登陆,在远程主机上获得相应的权限以后,方可下载或上传文件。也就是当有用户ID和口令的时候,才能传送文件。这违背了Internet的开放性,Internet上的FTP主机何止千万,不可能要求每个用户再每一台主机上都拥有账号。匿名FTP就是为解决这个问题产生的。

             通过FTP程序连接匿名FTP主机的方式同连接普通FTP主机的方式差不多,只是在要求提供用户标识ID时必须输入anonymous,该用户ID的口令可以是任意的字符串。习惯上,用自己的E-mail地址作为口令,使系统维护程序能够记录下来谁在存取这些文件。

             当远程主机提供匿名FTP服务时,会指定某些目录向公众开放,允许匿名存取。系统中的其余目录则处于隐匿状态。作为一种安全措施,大多数匿名FTP主机都允许用户从其下载文件,而不允许用户向其上传文件。


         ♦FTP服务器的作用是什么?

             

           FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。


         ♦为什么要有FTP服务器?

          

            一般来说,用户联网的首要目的就是实现信息共享,文件传输是信息共享非常重要的一个内容之一。Internet上早期实现传输文件,并不是一件容易的事,我们知道 Internet是一个非常复杂的计算机环境,有PC,有工作站,有MAC,有大型机,据统计连接在Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。 


         ♦传输文件的步骤

      

      
1在本地电脑上登陆到国际互联网, 
2搜索有文件共享主机或者个人电脑(一般有专门的FTP服务器网站上公布的,上面有进入该主机或个人电脑的名称,口令和路径) 
3当与远程主机或者对方的个人电脑建立连接后,用对方提供的用户名和口令登陆到该主机或对方的个人电脑. 
4在远程主机或对方的个人电脑登陆成功后,就可以上传你想跟别人分享的东东或者下载别人授权共享的东东(这里的东东是指能放到电脑里去又能在显示屏上看到的东东) 
5完成工作后关闭FTP下载软件,切断连接. 
为了实现文件传输,用户还要运行专门的文件传输程序,比如网际快车就有这方面的功能,其它还有很多专门的FTP传输软件,各有各的特色. 


【将图片上传到FTP服务器代码】

                

         1、配置文件

              

          

             


  
  
  1. #FTP
  2. FTP_URL=172.16
  3. FTP_USERNAME=afcp
  4. FTP_PASSWORD=123
  5. FTP_PATH=F:/ftp
  6. FTP_PORT=21

         2、工具类

           


  
  
  1. package com.cn.zhongcai.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9. import java.util.Properties;
  10. import org.apache.commons.net.ftp.FTP;
  11. import org.apache.commons.net.ftp.FTPClient;
  12. import org.apache.commons.net.ftp.FTPReply;
  13. public class Ftp{
  14. static SimpleDateFormat dfm = new SimpleDateFormat( "yyyy-MM-dd"); //设置日期格式
  15. /**
  16. * 获取配置文件中的配置
  17. *
  18. * @return
  19. */
  20. public static Map<String, String> findProperties() {
  21. Map<String, String> map = new HashMap<String, String>();
  22. Properties prop = new Properties();
  23. try {
  24. InputStream inStream = Ftp.class.getClassLoader().getResourceAsStream( "reader.properties");
  25. prop.load(inStream); /// 加载属性列表
  26. Iterator<String> it = prop.stringPropertyNames().iterator();
  27. while (it.hasNext()) {
  28. String key = it.next();
  29. map.put(key, prop.getProperty(key));
  30. }
  31. inStream.close();
  32. } catch (Exception e) {
  33. System.out.println(e);
  34. }
  35. return map;
  36. }
  37. /**
  38. * Description: 向FTP服务器上传文件
  39. * @param filename 上传到FTP服务器上的文件名(图片的名字)
  40. * @param catalog 模块目录名字(功能模块名称)
  41. * @param input 输入流(文件流)
  42. * @return 返回路径
  43. */
  44. public static String uploadFile(String filename, InputStream input,String catalog) {
  45. Map<String, String> map = findProperties();
  46. String url = map.get( "FTP_URL"); //IP地址
  47. String username = map.get( "FTP_USERNAME"); //用户名
  48. String password = map.get( "FTP_PASSWORD"); //密码
  49. String basePath = map.get( "FTP_PATH"); //路径
  50. String por = map.get( "FTP_PORT"); //端口号
  51. String filePath = dfm.format( new Date()); //当前时间
  52. int port = Integer.parseInt(por);
  53. String tempPath = ""; //保存图片进入的路径
  54. String path = ""; //返回全路径
  55. FTPClient ftp = new FTPClient();
  56. try {
  57. int reply;
  58. ftp.connect(url, port); // 连接FTP服务器
  59. // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
  60. ftp.login(username, password); // 登录
  61. //设置上传文件的类型为二进制类型
  62. ftp.setFileType(FTP.BINARY_FILE_TYPE);
  63. reply = ftp.getReplyCode();
  64. if (!FTPReply.isPositiveCompletion(reply)) {
  65. ftp.disconnect();
  66. return tempPath;
  67. }
  68. //切换到上传目录
  69. if (!ftp.changeWorkingDirectory(catalog)) { //判断是否有模块目录
  70. //创建模块文件夹
  71. String[] mkds1 = catalog.split( "/");
  72. for( int i = 0 ;i<mkds1.length;i++){
  73. if(mkds1[i]!= null && mkds1[i]!= ""){
  74. ftp.makeDirectory(mkds1[i]); //添加目录
  75. }
  76. ftp.changeWorkingDirectory(mkds1[i]); //添加完目录后 必须进入目录 才能在创建目录
  77. }
  78. if(!ftp.changeWorkingDirectory(filePath)) { //进入模块目录后判断是否有日期目录
  79. String[] mkds = filePath.split( "/");
  80. for( int y = 0 ;y<mkds.length;y++){
  81. if(mkds[y]!= null && mkds[y]!= ""){
  82. ftp.makeDirectory(mkds[y]);
  83. }
  84. ftp.changeWorkingDirectory(mkds[y]); //添加完目录后 必须进入目录 才能在创建目录
  85. }
  86. }
  87. } else if(!ftp.changeWorkingDirectory(filePath)){ //如果有进入目录创建日期目录
  88. String[] mkds = filePath.split( "/");
  89. for( int i = 0 ;i<mkds.length;i++){
  90. if(mkds[i]!= null && mkds[i]!= ""){
  91. ftp.makeDirectory(mkds[i]);
  92. }
  93. ftp.changeWorkingDirectory(mkds[i]); //添加完目录后 必须进入目录 才能在创建目录
  94. }
  95. }
  96. tempPath = basePath+ "/"+catalog+ "/"+filePath;
  97. ftp.changeWorkingDirectory(tempPath);
  98. ftp.storeFile(filename, input); //存入图片
  99. input.close();
  100. ftp.logout();
  101. path = "http://"+url+ ":8001"+ "/"+catalog+ "/"+filePath+ "/"+filename;
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. } finally {
  105. if (ftp.isConnected()) {
  106. try {
  107. ftp.disconnect();
  108. } catch (IOException ioe) {
  109. }
  110. }
  111. }
  112. return path;
  113. }
  114. }

        3、上传图片

           


  
  
  1. //提交检查项的反馈
  2. /**
  3. *
  4. * @param TaskMainID 任务ID,非主键
  5. * @param contentID 反馈项ID
  6. * @param score 分数
  7. * @param detail 说明
  8. * @param userID 管理员ID
  9. * @param files 图片
  10. * @param request
  11. * @return
  12. */
  13. @ResponseBody
  14. @RequestMapping( "/addContentFeedBack")
  15. public Map<String,Object> addContent(@RequestParam(value="TaskID") String TaskMainID,
  16. @RequestParam(value="contentID") String contentID,
  17. @RequestParam(value="score") Double score,
  18. @RequestParam(value="detail") String detail,
  19. @RequestParam(value="userID") String userID,
  20. @RequestParam(value="files",required=false) CommonsMultipartFile[] files,HttpServletRequest request
  21. ){
  22. String userName= "";
  23. String timeDate= "";
  24. String idString= "";
  25. try {
  26. //反馈主键
  27. idString=BaseUtil.getId();
  28. userName=productService.findAdminNameByID(userID);
  29. SimpleDateFormat timeFomrate = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
  30. timeDate=timeFomrate.format( new java.util.Date());
  31. //提交检查项的反馈
  32. adminService.addContentFeedBack(idString,TaskMainID,contentID,score,detail,userName,timeDate);
  33. } catch (Exception e) {
  34. System.out.println(e);
  35. return AjaxReturnUtils.ReturnFalse( "操作失败");
  36. }
  37. //*********************************************
  38. //将图片信息存入ftp服务器,并将地址存到设备报修图片表
  39. if (files!= null) {
  40. InputStream input;
  41. String filename;
  42. String catalog= "app_admin";
  43. String path;
  44. try {
  45. for ( int i = 0; i < files.length; i++) {
  46. input = files[i].getInputStream();
  47. filename = files[i].getOriginalFilename();
  48. //给她传参数,上传到ftp服务器,返回地址。
  49. path=Ftp.uploadFile(filename, input, catalog);
  50. try {
  51. //存到数据库中,把检查项反馈的照片
  52. String idString1=BaseUtil.getId(); //照片表ID
  53. adminService.addContentFeedBackImage(idString1,idString,path,userName,timeDate);
  54. System.out.println(path);
  55. } catch (Exception e) {
  56. System.out.println(e);
  57. return AjaxReturnUtils.ReturnFalse( "操作失败");
  58. }
  59. }
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. //*********************************************
  65. return AjaxReturnUtils.Return( "操作成功");
  66. }

        注意这里用到了:CommonsMultipartFile[]


        需要在配置文件(springMVC.xml)里配一下:

         


  
  
  1. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  2. <property name="defaultEncoding" value="utf-8"> </property>
  3. <property name="maxUploadSize" value="10485760000"> </property> <!-- 最大上传文件大小 -->
  4. <property name="maxInMemorySize" value="10960"> </property>
  5. </bean>

        


小结:

      对比FTP服务器和FastDFS,FastDFS的优点就是在于它的:冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。分目录存储和由服务器分配文件名 的情境下使用比较合理。在选择那种方式进行文件存储时,不要盲目贪大,结合实际情况才可以。

      另外还涉及到其他的文件传输方式的对比:请点击


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值