# 使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器
## 安装vsftp
1、首先,安装vsftpd
```shell
yum -y install vsftpd
复制代码
```
2、验证是否安装成功
```shell
rpm -qa vsftpd
复制代码
```
3、查看vsftp相关配置文件
```shell
ll /etc/vsftpd/
复制代码
```
`vsftpd.conf`文件是主要的配置文件,一些关键的配置都在其中
`ftpusers`文件是禁止使用vsftpd的用户列表文件,记录不允许访问FTP服务器的用户名单
`user_list`这个文件禁止或允许使用vsftpd的用户列表文件,这个文件中指定的用户缺省情况(即在`vsftpd.conf`中设置`userlist_deny=YES`)下也不能访问FTP服务器,在设置了`userlist_deny=NO`时,仅允许`user_list`中指定的用户访问FTP服务器
4、先备份一份vsftpd.conf文件
```shell
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd-default.conf
复制代码
```
5、修改vsftpd.conf配置文件
```shell
vim /etc/vsftpd/vsftpd.conf
复制代码
```
![image-20201112191932974](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6292c70bed724e8fa9b2a63153b9a4b1~tplv-k3u1fbpfcp-zoom-1.image)
把`anonymous_enable=YES`改为`NO`,表示不允许匿名访问
![image-20201112192347055](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/61cc935d6d7643dc997692c72bcf9301~tplv-k3u1fbpfcp-zoom-1.image)
然后把`listen=NO`改为`YES`,`listen_ipv6=YES`改为`NO`
再在该文件的最后添加以下数据:
```shell
#仅允许user_list文件中的用户访问FTP服务
userlist_deny=NO
#被动模式端口范围
pasv_min_port=30000
pasv_max_port=30999
复制代码
```
6、创建一个用来登录FTP服务的用户
```shell
useradd ftpuser
passwd ftpuser
#输入两次密码
复制代码
```
7、将ftpuser用户加进user_list文件最后一行
```shell
vim /etc/vsftpd/user_list
复制代码
```
8、启动FTP服务
```shell
systemctl start vsftpd
复制代码
```
**9、服务器开放21端口和30000/30999端口范围**
10、浏览器访问测试是否成功:
ftp://服务器ip地址/
## Nginx进行配置
打开nginx配置文件
```shell
vim /usr/local/nginx/conf/nginx.conf
复制代码
```
修改以下内容
![image-20201112200536867](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2d95f94d7dfa486297d6aca27602ba2a~tplv-k3u1fbpfcp-zoom-1.image)
重启nginx:
```shell
cd /usr/local/nginx/sbin/
./nginx -s reload
复制代码
```
**服务器开放端口:9999**
## Java实现上传图片的功能
1、添加依赖:
```xml
commons-net
commons-net
3.6
复制代码
```
2、application.properties配置文件添加以下内容:
```properties
#配置文件上传器
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
#ftp相关配置
#服务器地址
FTP.ADDRESS=192.168.xx.xxx
#FTP服务端口,默认是21
FTP.PORT=21
#访问FTP服务的用户名
FTP.USERNAME=ftpuser
#访问FTP服务的用户名对应的密码
FTP.PASSWORD=ftpuser
#图片存放在服务器指定的文件夹
FTP.BASEPATH=/home/ftpuser/images
#访问图片的基本url,如果端口号为80就不用加端口,192,168.xx.xxx为服务器ip地址
IMAGE.BASE.URL=http://192.168.xx.xxx:9999/images
复制代码
```
3、FtpUtils:用于上传文件的工具类
```java
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//设置为被动模式
ftp.enterLocalPassiveMode();
//设置编码格式为utf-8
ftp.setControlEncoding("UTF-8");
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//设置存储图片的文件夹
ftp.changeWorkingDirectory(basePath);
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
复制代码
```
4、用于生成随机图片名
```java
public class IDUtils {
/**
* 生成随机图片名
*/
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
}
复制代码
```
5、上传图片的Controller
```java
/**
* 上传图片
*/
@Controller
@RequestMapping("/admin")
public class UploadController {
@Value("${FTP.ADDRESS}")
private String host;
// 端口
@Value("${FTP.PORT}")
private int port;
// ftp用户名
@Value("${FTP.USERNAME}")
private String userName;
// ftp用户密码
@Value("${FTP.PASSWORD}")
private String passWord;
// 文件在服务器端保存的主目录
@Value("${FTP.BASEPATH}")
private String basePath;
// 访问图片时的基础url
@Value("${IMAGE.BASE.URL}")
private String baseUrl;
/**
* 上传图片到服务器
* @param uploadFile
* @return
*/
@PostMapping("/upload/file")
public String pictureUpload(@RequestParam("file") MultipartFile file) {
try {
//1、给上传的图片生成新的文件名
//1.1获取原始文件名
String oldName = file.getOriginalFilename();
//1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
String newName = IDUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
//2、把图片上传到图片服务器
//2.1获取上传的io流
InputStream input = file.getInputStream();
//2.2调用FtpUtil工具类进行上传
boolean result = FtpUtil.uploadFile(host, port, userName, passWord, basePath, newName, input);
if(result) {
//返回给前端图片访问路径
return baseUrl+"/"+newName;
}else {
return "false";
}
} catch (IOException e) {
e.printStackTrace();
return "false";
}
}
}
复制代码
```
6、测试
```html
Insert title here复制代码
```
7、提交图片后后端会返回一个图片路径,复制到地址栏看看是否能访问
到此,使用java上传图片就完成了。
一键复制
编辑
Web IDE
原始数据
按行查看
历史