vsftpd+nginx+springmvc+spring简单实现前端浏览器上传文件到服务器

本文详细介绍了如何在Linux环境下利用VSFTPD和Nginx搭建文件上传服务,通过Eclipse进行文件上传操作。文章涵盖创建Web项目、后端控制器、Service层接口与实现、配置web.xml、spring-mvc.xml、spring-service.xml,以及编写属性文件、工具类等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

在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;
	}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值