1.前端使用表单,并且指定enctype="multipart/form-data" | <form method="post" action="shangchuanftp" enctype="multipart/form-data" > <input type="file" name="file" /> <input type="submit" value="上传" /> </form> |
2.在springmvc中添加bean依赖 | <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 10m --> <property name="maxInMemorySize" value="4096" /> <property name="defaultEncoding" value="UTF-8"></property> </bean> |
3.pom.xml中添加这个三个依赖 | <!--图片上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.0.1</version> </dependency> <!--文件上传 需要的 依赖--> <!-- ftpclient --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.1</version> </dependency> |
前端 jsp 的代码就是一个简单表格
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<form method="post" action="shangchuanftp" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
</body>
</html>
后端的 代码是:
注释就是我的解释
package com.sun.controller;
import jdk.nashorn.api.scripting.ScriptUtils;
import org.apache.commons.net.ftp.FTP;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.apache.commons.net.ftp.FTPClient;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.sound.midi.Soundbank;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
/**
* create by Sun
* 2018/7/31
*/
@Controller
public class photoUpload {
@RequestMapping("/shangchuanftp")
@ResponseBody
public Map<String,Object> upload(MultipartFile file, HttpServletRequest request) {
Map<String,Object> map=new HashMap<>();
//这个文件,图片的名称
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
System.out.println("1拓展名是:"+substring);
ServletContext servletContext = request.getSession().getServletContext();
System.out.println("2这个路径就是发布之后的 webapp路径:"+servletContext);
String path = servletContext.getRealPath("upload");//相当于在webapp下创建了一个 upload文件,用来暂时存放 前台传过来图片
System.out.println("3这个路径就是发布之后的getRealPath(\"upload\") path:"+path);//未发布在这里D:\ssmme\target\TTEST\upload,发布之后就在webapp/upload
String methodUpload = methodUploadTomcat(file, path);
map.put("url",methodUpload);
return map;
}
public String methodUploadTomcat(MultipartFile file,String path){
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
String uploadFileName=UUID.randomUUID().toString();
String methodUploadFtp=null;
File fileDir = new File(path);
if(fileDir.exists()==false){
//设置 可写的 权限,这个是在tomcat 服务器下,发布之后
fileDir.setWritable(true);
fileDir.mkdirs();
}
File targetFile=new File(path,uploadFileName);
System.out.println("targetFile:"+targetFile);
try {
file.transferTo(targetFile);
//这个时候,文件已经上传到了 tomcat 服务器下的 upload文件家下了
//todo 将targetFile图片传到ftp服务器上
methodUploadFtp = methodUploadFtp(targetFile);
//todo 将tomcat下的 upload下的图片删除,否则,你这个工程将会越来越大
targetFile.delete();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(methodUploadFtp+"jjjjj");
return methodUploadFtp;
}
public String methodUploadFtp(File targetFile){
//import org.apache.commons.net.ftp.FTP;用这个包的 FTPClient
//连接服务器
FTPClient ftpClient=new FTPClient();
try {
ftpClient.connect("192.168.227.128",21);
boolean login = ftpClient.login("ftpuser", "199692");
if (!login){
return "连接ftp服务器失败!";
}
} catch (IOException e) {
return "连接ftp服务器失败!"+e.getMessage();
}
//remotePath 这个 ftp 服务器上的目录 还可以自己在封装,拼接一个 目录 根据 id 或者其他 ,这边我们没有业务需求,就写死
String remotePath="/home/ftpfile/ftpImage";
try {
//先判断这个路径是否存在,不存在就创建,但是只能一级一级创建
boolean exist= ftpClient.changeWorkingDirectory(remotePath);
if(!exist){
System.out.println("创建上传路径,只能创建一级的目录!");
ftpClient.makeDirectory(remotePath);
}
//指定,或者更换 上传路径
ftpClient.changeWorkingDirectory(remotePath);
ftpClient.setBufferSize(10240);//设置缓冲大小
ftpClient.setControlEncoding("UTF-8"); //设置编码
//设置上传文件的类型,二进制文件
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
/* 如果你的ftp服务器是被动模式,并且开启了一些端口,那么就这么弄,否则不需要
ftpClient.enterLocalPassiveMode();*/
//转换为输入流
FileInputStream fileInputStream=new FileInputStream(targetFile);
System.out.println("targetFileName: "+targetFile.getName());
ftpClient.storeFile(targetFile.getName(),fileInputStream);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ftpClient.disconnect();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
return "ftp://192.168.227.128"+remotePath+"/"+targetFile.getName();
}
}