linux安装vsftpt服务,centos安装vsftp服务.md
# 使用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
复制代码
```

把`anonymous_enable=YES`改为`NO`,表示不允许匿名访问

然后把`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
复制代码
```
修改以下内容

重启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
原始数据
按行查看
历史
相关文章:

android support v4、v7、v13
android support v4、v7、v13的区别及作用和用法 1, Android Support V4, V7, V13是什么? 本质上就是三个java library。 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support 3, 三个Support 库的…

SimpleInjector 简单使用
SimpleInjector 简单使用,未完待续转载于:https://www.cnblogs.com/aresyl/p/6627372.html

win设置计算机网络,Win10怎么修改网络类型,Win10网络类型怎么设置?
Win10怎么修改网络类型,Win10网络类型怎么设置?对某件事物越是了解的深入,越是能发现产品的猫腻!比如Win10!因为产品性能没升级多少,但是马甲换的却非常勤快!可能有些朋友会感觉,下面的内容似曾相识。下面的Win10怎么修改网络类型的内容&…

GIL+死锁与递归锁+信号量+event事件
GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行 但是可以实现并发 在Cpython解释器下,如果想实现并行可以开…

编程之法----面试和算法心得
第1章 字符串 1.1 字符串的旋转 输入一个英文句子,翻转句子中单词的顺序。要求单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如:若输入“I am a student.”,则输出“stude…

ios 消息通知
苹果的通知分为本地通知和远程通知,这里主要说的是远程通知 历史介绍 iOS 3 - 引入推送通知UIApplication 的 registerForRemoteNotificationTypes 与 UIApplicationDelegate 的 application(_:didRegisterForRemoteNotificationsWithDeviceToken:),appl…

aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取
本小菜先后安装雪豹和lion,驱动一直不能完美解决。本想靠dsdt和idsdt大法驱动我的G310M显卡,可是困难重重。小本bios为phoenix,而非各位大神提供的ami和aword板,编译错误达到201处,更改rtc处编译剩余7处错误࿰…

华南理工网络计算机基础知识,2019年华南理工大学网络教育计算机基础随堂练习第一章...
2019年华南理工大学网络教育计算机基础随堂练习第一章 (9页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!11.90 积分第一章 计算机基础知识第一节 计算机的基本概念随堂练习提交截止时间…

AFN 切换BaseUrl
在某个特定的接口需要修改baseurl时: 直接使用kvc: [_sessionManager setValue:[NSURL URLWithString:NEW_BASE_URL] forKey:"baseURL"];在发出请求后,在修改会通用的baseurl 转载于:https://www.cnblogs.com/liuwenqiang/p/960667…

按下开机键,计算机背后的故事
计算机是如何启动的? 从打开电源到开始操作,计算机的启动是一个非常复杂的过程。 我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示...…… 零、boot的含义 问:"启动"用英语怎么说&#…

android 图片缓存
一、Picasso https://github.com/square/picasso Picasso是Square公司开源的一个Android平台上的图片加载框架,简单易用,一句话搞定项目中的图片加载,好用到令人发指。 使用一句话:Picasso.with(this).load("url").plac…

linux shell cgi post,linux下shell处理cgi的方法--post get
web server获取网页上HTML的DOM对象信息发送来的信息,主要有get和post方法。介绍原理的文章很多,但介绍实际应用到linux的shell中的文章很少。1、get方法①表单源码如下,有几个HTML对象作为传值对象。CGI TestText fieldRadio button123②cgi…

福建工程学院计算机科学类投档线,2019年福建工程学院美术类本科专业投档分数线...
福建工程学院2019年美术类本科专业录取情况省份科类专业计划最高分最低分平均分江苏艺术综合环境设计5247.2241.2244.6视觉传达设计3244.2240241.8数字媒体艺术3247.2244.2246产品设计3243.8238.6241.1安徽艺术综合环境设计5728.7724.9726.9视觉传达设计4729726.5727.3数字媒体…

如何对正在运行的进程,进行heap profile
简单来说, 就是先preload上tcmalloc, 日常用用没啥问题, 当感觉出现问题时, gdb attach 上, 然后执行 call HeapProfilerStart("xxx") , 过一段时间, 再执行call HeapProfilerStop, 产出相应的profile文件, 然后detach出进程 以下为一些未整理的 link https://gperft…

linux 命令窗口美化,美化你的命令行终端Terminal
yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20…

mac 显示隐藏文件
打开终端,输入:defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool false 此命令关闭显示隐藏文件命令运行之后需要重新加载Finder:快捷…

Android修改包名
1.直接Refactor ---> rename 2.修改build.gradle ---> applicationId 为新包名 3.修改后要注意XML中自定义控件的全名是否也改变了 参考:android studio 改包名转载于:https://www.cnblogs.com/jarvisyin/p/6634392.html

学计算机的好处处300字,学计算机的心得体会300字
学计算机的心得体会300字我们从一些事情上得到感悟后,可以寻思将其写进心得体会中,这么做可以让我们不断思考不断进步。那么好的心得体会都具备一些什么特点呢?以下是小编精心整理的学计算机的心得体会300字,欢迎大家分享。学计算…

洛谷 3519 bzoj 2213 Difference
联考考试考到了这个题,随机化40分,现在来秒掉它吧。 题意: 给一个字符串,求其中的一段,使得出现次数最多的字符与出现次数最少的字符的出现次数之差最大。 输入输出样例 输入样例#1: 复制 10 aabbaaabab 输…

linux 文件管理 教程,Linux文件管理
Linux文件管理本文介绍如何在Linux上创建文件、删除文件、复制文件、移动文件使用touch命令在linux上创建文件使用rm命令在linux上删除文件使用cp命令在linux上复制拷贝文件mv命令在linux上移动或重命名文件##文件简介Linux中文件可以分为普通文件、目录文件、链接文件、设备文…

ios cocopods 安装使用及高级教程
CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的名字叫做:CocoaPods。http://co…

单片微型计算机概念及组成,中国民用航空飞行学院2014年微机原理与接口考研复习大纲...
中国民用航空飞行学院硕士研究生入学考试801《微机原理与接口》复习大纲第一部分 考试说明一、 考试性质《微机原理与接口》是中国民用航空飞行学院硕士生入学考试科目之一。它的评价标准是高等学校、科研院所的优秀本科毕业生能达到及格以上水平,以保证被录取者具…

【转】Jmeter常见问题
收集工作中JMeter遇到的各种问题1. JMeter的工作原理是什么?向服务器提交请求;从服务器取回请求返回的结果。2. JMeter的作用?JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ft…

linux的tar中ztvf,linux中的tar命令(2)
实例4:只将 /tar 内的 部分文件解压出来命令:tar -zxvf /opt/soft/test/log30.tar.gz log2013.log输出:[rootlocalhost test]# tar -zcvf log30.tar.gz log2012.log log2013.loglog2012.loglog2013.log[rootlocalhost test]# ls -al log30.ta…

xcode 消除警告
项目中引用大量的第三方代码时,这些代码很复杂,不要轻易去改动它,如果编译产生很多警告,该如何消除呢? 1. 最直接、最一劳永逸、最安全的方式,直接找到警告的那段代码,改为不警告。这个方式最安…

RoadMap
转载于:https://www.cnblogs.com/taogao3364/p/9616020.html

罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...
美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华,1. 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克…

Win10系列:VC++调用自定义组件1
通过20.9.1小节中的代码和步骤编写了一个名为"FilePickerComponent"的WinRT组件,接下来将在上一小节所新建的项目基础上,继续介绍如何在不同的语言所编写的应用中调用这个WinRT组件。 (1)JavaScript调用WinRT组件 在解决…

windows常用命令有哪些(整理)
windows常用命令有哪些(整理) 一、总结 一句话总结:其实这个好学,只要先弄懂主干,清除主干,那么枝叶的添加逻辑就很清除了 这种多内容的,散乱的,弄清除主干效率就高了 1、windows命令…

c语言定义字符类型变量的关键字,C语言数据类型
C语言关键字:也称保留字,是C语言预先定义的、具有特殊意义的单词。数据类型关键字(12个):(1)char:声明字符型变量或函数(2)double:声明双精度变量或函数(3)enum:声明枚举类型(4)float:声明浮点型…