**
在linux上搭建vsftpd和nginx,搭建环境就不说了,直接用eclipse写文件上传。
**
1 创建一个web项目,使用注解式开发
2 创建后端控制器pojo
@Controller
public class FileUploadControl {
@Resource
private FileUploadService fileUploadService;
@RequestMapping("/fileUpload")
public String fileUpload(MultipartFile img,Model model){
try {
String src = fileUploadService.fileUpload(img);
if(src != null){
model.addAttribute("url", src);
return "/success.jsp";
}
} catch (Exception e) {
e.printStackTrace();
}
return "/fail.jsp";
}
}
3 创建service层
3.1 接口
public interface FileUploadService {
String fileUpload(MultipartFile img) throws Exception;
}
3.2 实现类,使用两个工具类IDUtils,FtpUtil
@Value("${vsftp.host}")
private String host;
@Value("${vsftp.port}")
private int port;
@Value("${vsftp.username}")
private String username;
@Value("${vsftp.password}")
private String password;
@Value("${vsftp.basePath}")
private String basePath;
@Value("${vsftp.filePath}")
private String filePath;
@Value("${vsftp.negix}")
private String negix;
public String fileUpload(MultipartFile img) throws Exception {
// 获取文件名
String filename = IDUtils.genImageName() + img.getOriginalFilename().substring(img.getOriginalFilename().lastIndexOf("."));
InputStream input = img.getInputStream();
boolean result = FtpUtil.uploadFile(host, port, username, password, basePath, filePath, filename, input);
if(result){
//如果长传成功就返回文件的地址
return negix+filename;
}
return null;
}
4 编写web.xml文件
<!-- 字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 指定spring配置文件的路径及名称 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<!-- 监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
5 编写spring-mvc.xml
<!-- 解决静态资源无法访问 -->
<mvc:default-servlet-handler/>
<!-- 注册注解驱动 -->
<mvc:annotation-driven/>
<!-- 注册组件扫描器 -->
<context:component-scan base-package="com.bjsxt.controller"/>
<!-- 文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
6 编写spring-service.xml
<!-- 加载属性文件 -->
<context:property-placeholder location="classpath:*.properties"/>
<!-- 注册组件扫描器 -->
<context:component-scan base-package="com.bjsxt.service.impl"/>
7 编写ftp.properties属性文件,连接ftp服务器所需的参数
vsftp.host=192.168.220.30
vsftp.port=21
vsftp.username=ftpuser
vsftp.password=ftpuser
vsftp.basePath=/home/ftpuser/
vsftp.filePath=/
vsftp.negix=http://192.168.220.30/
8 创建index.jsp简单网页
添加一个form表单
<form action="${pageContext.request.contextPath }/fileUpload" method="POST" enctype="multipart/form-data">
<input type="file" name="img"/>
<input type="submit" value="提交"/>
</form>
9 两个工具类IDUtils,FtpUtil
FtpUtil
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;
}
}
**
* 各种id生成策略
* @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;
}
}