1.搭建一个NAS服务器
新手教程:https://post.smzdm.com/p/a3gw7q27/
这篇文章我只进行到第二大步,第三步配置DDNS,安装应用程序,我没有实现,连不上网络。
2.外网访问
在加了一些相关群之后,我了解到了需要如何才能外网访问NAS,也就是第三步。
步骤如下
如上图,公网IP需要给连接网络所在运营商(联通,电信,移动)去申请,这个申请其实还是比较麻烦的,那么就只能是改公网IP,目前我没有找到改公网IP的办法,所以上图中的方式也就不行了。
2.1 使用内网穿透连接NAS
花生壳我就不多介绍了,能玩NAS,肯定也知道花生壳。
花生壳是可以分配一个域名给用户使用的,外网端口一般也是随机生成的。
内网主机:也就是NAS服务器的内网IP,端口为21。
3.设置NAS文件传输器
因为花生壳映射的端口是变化的,通常在10000-30000之间
4.通过FTP连接到NAS服务器。上传文件
import org.apache.commons.net.ftp.FTPClient;
import org.apache.log4j.Logger;
import java.io.*;
/**
* 通过FTP上传文件
*
* @Author lvhaibao
* @Date 2018/2/11 21:43
*/
public class FTPTools {
//用于打印日志
private static final Logger log = Logger.getLogger(FTPTools.class);
//设置私有不能实例化
private FTPTools() {
}
/**
* 上传
*
* @param hostname ip或域名地址
* @param port 端口
* @param username 用户名
* @param password 密码
* @param workingPath 服务器的工作目
* @param inputStream 要上传文件的输入流
* @param saveName 设置上传之后的文件名
* @return
*/
public static boolean upload(String hostname, int port, String username, String password, String workingPath, InputStream inputStream, String saveName) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
//1 测试连接
if (connect(ftpClient, hostname, port, username, password)) {
try {
//2 检查工作目录是否存在
if (ftpClient.changeWorkingDirectory(workingPath)) {
// 3 检查是否上传成功
if (storeFile(ftpClient, saveName, inputStream)) {
flag = true;
disconnect(ftpClient);
}
}
} catch (IOException e) {
log.error("工作目录不存在");
e.printStackTrace();
disconnect(ftpClient);
}
}
return flag;
}
/**
* 断开连接
*
* @param ftpClient
* @throws Exception
*/
public static void disconnect(FTPClient ftpClient) {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
log.error("已关闭连接");
} catch (IOException e) {
log.error("没有关闭连接");
e.printStackTrace();
}
}
}
/**
* 测试是否能连接
*
* @param ftpClient
* @param hostname ip或域名地址
* @param port 端口
* @param username 用户名
* @param password 密码
* @return 返回真则能连接
*/
public static boolean connect(FTPClient ftpClient, String hostname, int port, String username, String password) {
boolean flag = false;
try {
//ftp初始化的一些参数
ftpClient.connect(hostname, port);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("UTF-8");
if (ftpClient.login(username, password)) {
log.info("连接ftp成功");
flag = true;
} else {
log.error("连接ftp失败,可能用户名或密码错误");
try {
disconnect(ftpClient);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
log.error("连接失败,可能ip或端口错误");
e.printStackTrace();
}
return flag;
}
/**
* 上传文件
*
* @param ftpClient
* @param saveName 全路径。如/home/public/a.txt
* @param fileInputStream 要上传的文件流
* @return
*/
public static boolean storeFile(FTPClient ftpClient, String saveName, InputStream fileInputStream) {
boolean flag = false;
try {
if (ftpClient.storeFile(saveName, fileInputStream)) {
flag = true;
log.error("上传成功");
disconnect(ftpClient);
}
} catch (IOException e) {
log.error("上传失败");
disconnect(ftpClient);
e.printStackTrace();
}
return flag;
}
public static void main(String[] args) throws FileNotFoundException {
String hostname = "ip";
int port = 端口;
String username = "nas账户";
String password = "nas密码";
String workingPath = "/NAS/images/";
String str = "C:\\Users\\43834\\Desktop\\1.png";
InputStream fileInputStream = new FileInputStream(new File(str));
String saveName = "1.png";
System.out.println(FTPTools.upload( hostname, port, username, password, workingPath, fileInputStream, saveName));
}
}
如果只是内网下使用NAS,那么可以直接输入NAS IP+端口 ,这样速度很快。
外网就需要映射的url+端口了!