filezilla 安装
FileZilla
分为客户端与服务端,我使用的是xampp自带的FileZilla
服务端,客户端是直接百度搜索下载的
xampp 中的 FileZilla
首先启动 FileZilla
服务
然后点 admin ,会弹出 登陆窗口,这里可以写密码
然后点击 编辑->用户
点击常规,添加一个用户,再勾选启用账户和密码,设置密码
点击共享文件夹
点击添加,设置一个共享文件夹,还要设置文件夹的权限,这个就看你的需求了,这里我全部选上了
还得点击右边的添加,添加一个用户
现在FileZilla
服务就算是配置好了
我的目录是:
F:\projectpath\bookstore\project\images
在这个文件夹里放一个图片,然后打开浏览器,输入以下地址
ftp://127.0.0.1/banner/banner.git.gif
也就是 ftp://127.0.0.1
后面跟上你图片在共享文件夹中的相对路径
会让你输入用户名和密码,这个用户名和密码是 编辑->用户 中设置的,不是一开始的寻个管理密码,然后就可以看到图片了
FileZilla 客户端的使用
百度搜索即可
安装过程不再赘述
打开 FileZilla
客户端
点击 文件-> 站点管理
点击新站点,输入主机名,登录类型选择正常,设置用户名和密码 注意:这里的用户名和密码是你在 xampp 中的 fileZilla 服务中创建的用户名和密码,然后点击确定即可
然后再输入地址,用户名,密码,再点快速连接。端口号默认为21
登陆成功后,界面如下
操作方法已在图中说明
代码
Spring Boot 配置
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.laolang.gongda.bookstore</groupId>
<artifactId>bookstore</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!--<packaging>war</packaging>-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- war -->
<!--import org.springframework.boot.builder.SpringApplicationBuilder;-->
<!--import org.springframework.boot.context.web.SpringBootServletInitializer;-->
<!--public class ServletInitializer extends SpringBootServletInitializer {-->
<!--@Override-->
<!--protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {-->
<!--return application.sources(BootTwoApplication.class);-->
<!--}-->
<!--}-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
<!--<scope>provided</scope>-->
<!--</dependency>-->
<!-- /war -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>2.7.5</version>
</dependency>
<!-- apache -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<!-- 时间操作 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<build>
<finalName>bookstore</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.properties
# server
server.port=8080
server.context-path=/
# log
logging.config=classpath:logback.xml
logging.path=F:/projectpath/bookstore/log
# jpa
spring.datasource.url=jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.show-sql=true
# beetl
spring.beetl.root = classpath:/templates/
spring.beetl.prefix =
spring.beetl.suffix = .html
spring.beetl.order = 0
spring.beetl.cofig = classpath:beetl.properties
#ftp 配置
ftp.address=127.0.0.1
ftp.port=21
ftp.userName=laolang
ftp.passWord=fcl1164891
ftp.basePath=/upload
ftp.imageBasePath=http://image.bookstore.com/images/upload
注意最后的ftp配置
ftp 配置类
FtpConfig
package com.laolang.gongda.bookstore.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "ftp")
public class FtpConfig {
// ftp.address=127.0.0.1
// ftp.port=21
// ftp.userName=laolang
// ftp.passWord=fcl1164891
// ftp.basePath=/upload
// ftp.imageBasePath=http://image.bookstore.com/images
public FtpConfig() {
}
@Override
public String toString() {
return "FtpConfig{" +
"address='" + address + '\'' +
", port=" + port +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", basePath='" + basePath + '\'' +
", imageBasePath='" + imageBasePath + '\'' +
'}';
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getImageBasePath() {
return imageBasePath;
}
public void setImageBasePath(String imageBasePath) {
this.imageBasePath = imageBasePath;
}
private String address;
private Integer port;
private String userName;
private String passWord;
private String basePath;
private String imageBasePath;
}
其它的和普通 spring boot 项目没有什么区别
文件上传功能实现
IDUtils
package com.laolang.gongda.bookstore.utils;
import java.util.Random;
/**
* 各种id生成策略
* <p>Title: IDUtils</p>
* <p>Description: </p>
* <p>Company: www.itcast.com</p>
* @author 入云龙
* @date 2015年7月22日下午2:32:10
* @version 1.0
*/
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;
}
/**
* 商品id生成
*/
public static long genItemId() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上两位随机数
Random random = new Random();
int end2 = random.nextInt(99);
//如果不足两位前面补0
String str = millis + String.format("%02d", end2);
long id = new Long(str);
return id;
}
}
此类的作用是生成随机的文件名
FtpUtil
package com.laolang.gongda.bookstore.utils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
/**
* ftp上传下载工具类
* <p>Title: FtpUtil</p>
* <p>Description: </p>
* <p>Company: www.itcast.com</p>
* @author 入云龙
* @date 2015年7月29日下午8:11:51
* @version 1.0
*/
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, 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;
}
//切换到上传目录
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
//如果目录不存在创建目录
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
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;
}
/**
* Description: 从FTP服务器下载文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
这是 ftp 工具类
service && controller
service
PicUploadService
package com.laolang.gongda.bookstore.service;
import com.laolang.gongda.bookstore.config.FtpConfig;
import com.laolang.gongda.bookstore.utils.FtpUtil;
import com.laolang.gongda.bookstore.utils.IDUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Service
public class PicUploadService {
@Autowired
private FtpConfig ftpConfig;
public String uploadPic(MultipartFile multipartFile) {
if (null == multipartFile || multipartFile.isEmpty()) {
return null;
}
String originalFilename = multipartFile.getOriginalFilename();
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
String imageName = IDUtils.genImageName();
DateTime dateTime = new DateTime();
String filePath = dateTime.toString("/yyyy/MM/dd");
try {
FtpUtil.uploadFile(ftpConfig.getAddress(), ftpConfig.getPort(), ftpConfig.getUserName(), ftpConfig.getPassWord(),
ftpConfig.getBasePath(), filePath, imageName + ext, multipartFile.getInputStream());
} catch (IOException e) {
e.printStackTrace();
return null;
}
return ftpConfig.getImageBasePath() + filePath + "/" + imageName + ext;
}
}
controller
UploadController
package com.laolang.gongda.bookstore.web;
import com.laolang.gongda.bookstore.service.PicUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class UploadController {
@Autowired
private PicUploadService picUploadService;
@RequestMapping(value = "/upload")
public String uploadForm(){
return "upload";
}
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String upload( @RequestParam("file")MultipartFile multipartFile , Model model){
System.out.println("hello");
System.out.println("world");
String result = picUploadService.uploadPic(multipartFile);
if( null == result ){
result = "上传失败";
}
System.out.println(result);
model.addAttribute("msg",result);
return "result";
}
}
页面 && 使用
upload.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
<p>文件:<input type="file" name="file"/></p>
<p><input type="submit" value="上传"/></p>
</form>
</body>
</html>
使用效果
上传后,如果没有错误,就会返回对应的地址,这里我使用了 nginx
,加了一个域名
nginx 的简单配置可见:121 项目 015 笔记向 windows + nginx + tomcat 简单配置
在浏览器中输入此域名即可看到图片