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");
}
}
}