ftp服务器搭建(windows)+实现ftp图片上传对接
ftp服务器搭建(windows):
vsftpd简介:
vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。
下载地址:
http://download.happymmall.com/FTPServer.rar
安装启动步骤:
1.下载解压,点击.exe文件,打开看到如下界面:
2.用户名和密码可以自己随意设置,只要在登录的时候用这个就可以了,共享目录是你要共享出去的你本地的一个目录,上传下载也都在这个里面。
3.打开cmd,输入ipconfig,查看你自己的Ipv4地址
4.在浏览器中输入ftp://你的ip地址,弹出登录框,登录即可看到你的共享目录中的内容。
实现ftp图片上传对接:
1.将ftp服务器需要的配置信息放入properties中,包括ip, user, pwd, 域名前缀。例如:
ftp.server.ip=211.69.197.245
ftp.user=cq
ftp.pass=ftp123
ftp.server.http.prefix=http://img.mall.com/
2.写一个service,上传图片文件到ftp服务器,在这个service中,对path以及文件名做一定的处理,然后具体的上传工作由调用FTPUtil来实现。此时运行后也就需要将ftp服务器开启,才能正确连接并上传。
@Service("iFileService")
public class FileServiceImpl implements IFileService{ private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class); /**
* 上传图片文件到服务器
* @param file 要上传的图片文件
* @param path 上传路径
* @return 上传成功后的文件名返回
*/
public String upload(MultipartFile file, String path) {
//获取原始文件名
String fileName = file.getOriginalFilename();
//获取文件扩展名
//lastIndexOf:返回"."在fileName中最后一个匹配项的索引位置,即abc.jpg会返回.jpg
String fileExtensionName = fileName.substring(fileName.lastIndexOf(".") + 1);
//为了防止不同用户上传图片时,两张图片的文件名完全相同导致覆盖的情况,这里对文件名加上UUID防重复
String uploadFileName = UUID.randomUUID().toString() + "." + fileExtensionName;
//打印日志,通过{}进行占位,也就是一个占位符对应后面的一个数据,类似于c里面的printf("%c",h);
logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}", fileName, path, uploadFileName); //创建上传路径目录的文件对象
File fileDir = new File(path);
if(!fileDir.exists()) {
//如果不存在
//赋予这个文件fileDir可写
fileDir.setWritable(true);
//创建文件
//mkdir():当前级别
//mkdirs():如果上传的文件所在的文件是/a,/b,/c等,直接传到服务器上时,这些文件夹都没有,用mkdirs()就可以自动创建
fileDir.mkdirs();
}
File targetFile = new File(path, uploadFileName); try {
file.transferTo(targetFile);
//将targetFile上传到我们的ftp服务器上
FTPUtil.uploadFile(Lists.newArrayList(targetFile));
//已经上 传到ftp服务器上,删除upload下面的文件
targetFile.delete();
} catch (IOException e) {
logger.error("上传文件异常", e);
return null;
}
return targetFile.getName();
} }
3.写一个工具类FTPUtil,专门做图片上传的工作,在这个工具类中,从properties配置文件中拿到ip,user,pwd,在连接到ftp服务器后,用FTPClient做上传工作。
public class FTPUtil { private static final Logger logger = LoggerFactory.getLogger(FTPUtil.class); //根据key拿到value值
private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip");
private static String ftpUser = PropertiesUtil.getProperty("ftp.user");
private static String ftpPass = PropertiesUtil.getProperty("ftp.pass"); //构造器
public FTPUtil(String ip,int port,String user,String pwd){
this.ip = ip;
this.port = port;
this.user = user;
this.pwd = pwd;
}
//public开放方法
public static boolean uploadFile(List<File> fileList) throws IOException {
FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass);
logger.info("开始连接ftp服务器");
//remotePath是"img",也就是传到ftp文件夹下面的img这个文件夹下
boolean result = ftpUtil.uploadFile("img",fileList);
logger.info("ftp服务器,结束上传,上传结果:{}", result);
return result;
}
//上传的具体逻辑
//remotePath:远程路径,ftp服务器上的相对路径,上传到ftp服务器上,ftp服务器是一个文件夹,如果需要上传到这个文件夹下的一个文件夹的话,就需要用到remotePath
private boolean uploadFile(String remotePath,List<File> fileList) throws IOException {
boolean uploaded = true;
FileInputStream fis = null;
//连接FTP服务器
if(connectServer(this.ip,this.port,this.user,this.pwd)){
try {
//更改工作目录,将remotePath传入,如果是null,则不需要切换
ftpClient.changeWorkingDirectory(remotePath);
//设置缓冲区
ftpClient.setBufferSize(1024);
//设置encoding编码
ftpClient.setControlEncoding("UTF-8");
//设置文件类型为二进制类型,防止乱码
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//打开本地的ftp的被动模式
ftpClient.enterLocalPassiveMode();
for(File fileItem : fileList){
fis = new FileInputStream(fileItem);
//将文件存入ftpClient
ftpClient.storeFile(fileItem.getName(),fis);
} } catch (IOException e) {
logger.error("上传文件异常",e);
uploaded = false;
e.printStackTrace();
} finally {
//关闭ftpClient
fis.close();
ftpClient.disconnect();
}
}
return uploaded;
}
//连接ftp服务器
private boolean connectServer(String ip,int port,String user,String pwd){ boolean isSuccess = false;
ftpClient = new FTPClient();
try {
//ftp服务器的ip
ftpClient.connect(ip);
//验证ftp服务器用户验证是否通过
isSuccess = ftpClient.login(user,pwd);
} catch (IOException e) {
logger.error("连接FTP服务器异常",e);
}
return isSuccess;
} private String ip;
private int port;
private String user;
private String pwd;
//使用FTPClient上传下载
private FTPClient ftpClient; public String getIp() {
return ip;
} public void setIp(String ip) {
this.ip = ip;
} public int getPort() {
return port;
} public void setPort(int port) {
this.port = port;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public FTPClient getFtpClient() {
return ftpClient;
} public void setFtpClient(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
}
4.提供给controller:
String path = request.getSession().getServletContext().getRealPath("upload");
String targetFileName = iFileService.upload(file, path);
String url = PropertiesUtil.getProperty("ftp.server.http.prefix") + targetFileName;
Map fileMap = Maps.newHashMap();
fileMap.put("uri", targetFileName);
fileMap.put("url", url);
return ServerResponse.createBySuccess(fileMap);
5.在开启ftp服务器后,还需要开启nginx,才能利用nginx反向代理,定位到http://img.mall.com/...
ftp服务器搭建(windows)+实现ftp图片上传对接的更多相关文章
- [图床神器]Windows下的图片上传工具MPic
最近用hexo在github上搭建了一个静态博客,开始几天用起来感觉还挺好的,但是用了些天就觉得每次写文章插入图片就非常麻烦,而且如果图片多了的话上传和访问就很慢了.后来网上看了下发现mac下有款ip ...
- 使用阿里云服务器(OOS)实现图片上传
一: 页面 <%@ page language="java" contentType="text/html; charset=utf-8" pageEnc ...
- 图解FTP服务器搭建(Windows Server 2008)
http://wenku.baidu.com/link?url=aUMoUYvSXKbHdbOHt4lUUCq0BhjnPRTM8jNb80jjwJ4_CM5LFq3lSm6f1ZlPNbFo6HEj ...
- 使用canvas给图片添加水印, canvas转换base64,,canvas,图片,base64等转换成二进制文档流的方法,并将合成的图片上传到服务器,
一,前端合成带水印的图片 一般来说,生成带水印的图片由后端生成,但不乏有时候需要前端来处理.当然,前端处理图片一般不建议,一方面js的处理图片的方法不全,二是有些老版本的浏览器对canvas的支持度不 ...
- kindeditor图片上传 struts2实现
一.kindeditor以及struts2部署搭建不再赘述,如需要请参考kindeditor使用方法 Struts2框架搭建 二.kindeditor图片上传所依赖jar包在kindeditor\js ...
- FTP服务器搭建以及上传下载的学习
首先需要搭建FTP服务步骤如下: 1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启 2.打开 计算机-->管理--> 在这里我们可以看见 ...
- 【T电商2】ftp服务器搭建
一.为什么需要ftp? 分布式环境一般都有一个专门的图片服务器存放图片.我们使用虚拟机搭建一个专门的服务器来存放图片.在此服务器上安装一个nginx来提供http服务,安装一个ftp服务器来提供图片上 ...
- FTP服务器搭建及操作(一)
FTP服务器搭建及操作(一) FTP搭建 PHP FTP操作 搭建方法参照(windows):http://www.cnblogs.com/lidan/archive/2012/06/04/25351 ...
- (转)【Java FTP及FTP服务器搭建】
转至 http://blog.csdn.net/studyvcmfc/article/details/8147052 目录(?)[+] -[Java FTP及FTP服务器搭建] 一:本文采用apach ...
随机推荐
- 翻译 | “扩展asm”——用C表示操作数的汇编程序指令
本文翻译自GNU关于GCC7.2.0版本的官方说明文档,第6.45.2小节.供查阅讨论,如有不当处敬请指正…… 通过扩展asm,可以让你在汇编程序中使用C中的变量,并从汇编代码跳转到C语言标号.在汇编 ...
- 常用 Git 命令清单【转--阮一峰】
常用 Git 命令清单 感谢作者 --> 原文链接 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下 ...
- 剑指Offer - 九度1355 - 扑克牌顺子
剑指Offer - 九度1355 - 扑克牌顺子2014-01-30 23:19 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^). ...
- 《Cracking the Coding Interview》——第5章:位操作——题目2
2014-03-19 05:47 题目:给定一个double型浮点数,输出其二进制表示,如果不能在32个字符内完成输出,则输出“ERROR”. 解法:如果你熟悉IEEE754标准,应该知道double ...
- Canvas 给图形绘制阴影
/** * 图形绘制阴影 */ function initDemo6() { var canvas = document.getElementById("demo6"); if ( ...
- Lua2
1. 迭代器与Closure 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置. ...
- Python全栈工程师(每周总结:3)
ParisGabriel 每天坚持 一天一篇 点个订阅吧 灰常感谢 当个死 ...
- Ipython\Jupyter数据分析工具
使用Python进行数据分析优点 1 Python大量的库为数据分析和处理提供了完整的工具集 2 比起R和Matlab等其他主要用于数据分析的编程语言,Python更全能 3 Python库一直在增加 ...
- [muku][1 初始restful api] chorme安装jsonview 插件
https://github.com/gildas-lormeau/JSONView-for-Chrome https://www.cnblogs.com/androidstudy/p
- Servlet 返回Json数据格式
其实就是把数据库中的数据查询出来拼接成一个Json数据 import dao.UserDao; import endy.User; import javax.servlet.ServletExcept ...