1.首先使用连接工具连接到云服务器,这里我是使用PuTTY。
端口号22,SSH连接,open进行连接。
2.输入命令行下载安装vsftpd和ftp。
# yum install vsftpd -y
# yum install ftp
3.进入vsftpd.conf 配置文件编辑状态
# vi /etc/vsftpd/vsftpd.conf
/是搜索键,i是修改键,esc是取消键(确认键),修改完成点esc,然后输入 :wq 回车退出。
状态如图
4.启动FTP服务
service vsftpd start
5.查看FTP服务是否运行中
service vsftpd status
6.接下来新建一个用户我这里叫xiha:
useradd xiha
然后设置密码输入2次
passwd xiha
7.这里需要注意,需要在阿里云服务器页面,安全组规则,手动添加开放的端口号,ftp一般是 21 或 20 ,我这里有进行添加,要不然会连接不上,报错连接超时。
8.可以测试打开一个cmd窗口,输入ftp XXX.XX.XX.XXX
使用创建用户进行登录能否成功。
接下来就测试使用代码上传到ftp服务器上。
写一个简陋的上传页面
<!DOCTYPE html>
<html>
<head>
<title>uploadimg.html</title>
<meta name="keywords" content="keywords1,keywords2,keywords3"></meta>
<meta http-equiv="Content-Type" content="text/html;" charset="UTF-8"/>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/upload">
文件:<input type="file" name="head_img"/>
姓名:<input type="text" name="name"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
使用jar包
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.1</version>
</dependency>
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import net.xdclass.demo.domian.JsonDate;
@Controller
@PropertySource({"classpath:application.properties"})
public class FileController {
private static final String filePath = "\\root\\home\\xiha\\";
@RequestMapping(value="/upload")
@ResponseBody
public JsonDate upload(@RequestParam("head_img") MultipartFile file,HttpServletRequest request) throws IOException {
System.out.println("配置注入打印,文件路径为:"+filePath);
String name = request.getParameter("name");
System.out.println("用户名:"+name);
String fileName = file.getOriginalFilename();
System.out.println("上传文件名称:"+fileName);
String suffixName = fileName.substring(fileName.lastIndexOf("."));
System.out.println("上传的后缀:"+suffixName);
fileName = fileName+UUID.randomUUID()+suffixName;
System.out.println("转换后名称:"+ fileName);
//创建ftp客户端
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("GBK");
String hostname = "XXX.XX.XX.XXX";
int port = 21;
String username = "xiha";
String password = "XXXXX";
try {
//链接ftp服务器
ftpClient.connect(hostname, port);
//登录ftp
ftpClient.login(username, password);
int reply = ftpClient.getReplyCode();
System.out.println(reply);
//如果reply返回230就算成功了,如果返回530密码用户名错误或当前用户无权限下面有详细的解释。
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return new JsonDate(-2, "接上ftl失败");
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.makeDirectory("path");//在root目录下创建文件夹
boolean b = ftpClient.changeWorkingDirectory(filePath);
System.out.println("转换目录结果2:"+b);
InputStream input = file.getInputStream();
ftpClient.storeFile(fileName,input);
input.close();
ftpClient.logout();
return new JsonDate(1, "上传成功");
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally
{
if (ftpClient.isConnected())
{
try
{
ftpClient.disconnect();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
return new JsonDate(-1, "上传失败");
}
}
配置文件可以对上传文件大小进行配,不做配置只能上传小文件
上传成功后文件会存在新建用户目录下,我新建得用户是xiha,文件就在 cd /home/xiha 目录下。