菜鸟的成长之路——ftp的上传和下载

  FTP是一种文件传输协议,用户internet中文件的双向传输,也就是我们经常提到的两个概念:上传和下载。上传就是将文件从自己本地计算机上拷贝至远程主机,下载就是从远程主机上拷贝文件到自己的本地计算机。今天我们看一下vsftpd服务器的搭建,以及使用springmvc上传和下载。

1、安装vsftpd

sudo apt-get install vsftpd

2、创建ftp根目录

sudo mkdir /home/uftp

3、定义一个在根目录开始的用户caixiaobai

sudo useradd -d /home/uftp -s /bin/bash caixiaobai

4、设置caixiaobai用户密码

sudo passwd caixiaobai

5、修改vsftpd的配置文件

sudo vi /etc/vsftpd.conf

  需要将下面配置的注释去掉(删除“#”)

# write_enable=YES
# anon_mkdir_write_enable=YES
# anon_upload_enable=YES

  修改anonymous_enable的值为YES。

  在最后增加如下配置:

userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
seccomp_sandbox=NO
local_root=/home/uftp

6、给根目录设置增删改查权限

sudo chmod -R 777 /home/uftp

7、创建允许访问ftp的列表并将caixiaobai加进去

sudo vi /etc/allowed_users

  键入I进入编辑界面,输入caixiaobai,键入:X退出编辑。然后使用命令reboot重新启动虚拟机。

8、浏览器访问ftp服务器

  我们在远程计算机上访问urlftp://192.168.187.109然后输入刚才三四两个步骤创建的账号密码进行登陆,如果登陆成功,则表明vsftpd可以使用了。

9、springmvc上传和下载文件的代码

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>SpringClass</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringClass Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <!-- 自动下载springmvc需要的所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>SpringClass</finalName>
    </build>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringClass</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 中央处理器 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

springmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!-- 扫描所有的控制器 -->
    <context:component-scan base-package="com.login.web"></context:component-scan>
    <!-- 自动加载注解的映射处理器、适配器、视图解析器 -->
    <context:annotation-config></context:annotation-config>
    <!-- 配置媒体解析器的bean -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>
</beans>

FileUp.java

package com.login.web;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.net.ftp.FTPClient;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class FileUp {
    /**
     * 这是一个上传文件的方法,从前端上传到ftp文件服务器上
     * @param information 前端发送过来的非媒体数据
     * @param file 前端发送过来的媒体文件
     * @return 跳转页面逻辑地址
     * @throws Exception
     */
    @RequestMapping("/upload.action")
    public String upload(@RequestParam("information") String information,@RequestParam("file") MultipartFile file) throws Exception {
//      打印非媒体信息,证明非媒体信息和媒体信息可以同时发送
        System.out.println("上传文件的信息是"+information);
//      创建ftp并登陆
        FTPClient ftp = new FTPClient();
//      连接ftp服务器的ip
        ftp.connect("192.168.187.109");
//      输入账号密码进行登陆ftp
        ftp.login("uftp", "uftp123");
//      设置ftp服务器使用二进制数据传输
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//      在ftp服务器根目录“/home/uftp”中,创建b文件夹
        ftp.makeDirectory("/home/uftp/b");
//      改变当前目录到刚才新创建的b文件夹
        ftp.changeWorkingDirectory("/home/uftp/b");
//      linux每次连接数据都会换一个端口,但是很多端口并没有开启,所以会造成阻塞。
//      为了防止这个问题的发生,我们使用如下配置告诉ftp服务器每次连接数据开辟一个端口。
        ftp.enterLocalPassiveMode();
//      使用storeFile方法上传文件,第一个参数是文件名(从发送过来的文件中获取),第二个参数是文件输入流(从发送过来的文件中获取)
//      返回值如果为true则上传成功,返回false则上传失败
        boolean result = ftp.storeFile("upload.rft", file.getInputStream());
//      打印上传状态,可以详细指导当前所存在的问题
        System.out.println(ftp.getReplyString());
        if(result) {
            return "redirect:success.jsp";
        }else {
            return "redirect:fail.jsp";
        }
    }
    /**
     * 下载文件的方法
     * @param response 响应
     */
    @RequestMapping("/download.action")
    public void download(HttpServletResponse response) {
        try {
//          创建ftp服务器并连接
            FTPClient ftp = new FTPClient();
            ftp.connect("192.168.187.109");
            ftp.login("uftp", "uftp123");
//          设置传输格式为二进制
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//          改变当前路径到需要下载文件的路径
            ftp.changeWorkingDirectory("/home/uftp/b");
//          linux每次连接数据都会换一个端口,但是很多端口并没有开启,所以会造成阻塞。
//          为了防止这个问题的发生,我们使用如下配置告诉ftp服务器每次连接数据开辟一个端口。
            ftp.enterLocalPassiveMode();
//          创建头协议
            HttpHeaders headers = new HttpHeaders();
//          添加头协议,指定响应文件保存到磁盘的名字
            response.setHeader("Content-Disposition", "attachment;filename=test.jpg");
//          headers.setContentDispositionFormData("attachment", "test.rtf");
//          添加头协议,指定响应文档的MIME类型
            response.setHeader("Content-type","application/*");
//          headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//          使用ftp下载文件到输出流中,第二个为响应的输出流
            ftp.retrieveFile("upload.rft", response.getOutputStream());
            System.out.println(ftp.getReplyString()+"======");
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("aaaaaaaaaaaaaaaa");
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值