1.首先我们需要在Linux中安装vsftpd,之后对应的会使用ftpclient来进行图片上传。为了实现图片回显,在这个Linux中也要安装Nginx。之后我们引入相关的jar,因为要用到FtpClient,所以我们现在parent项目中的pom中引入相关的jar,然后在到Commons中也引入一下。
<properties>
<ftpclient-version>3.3</ftpclient-version>
</properties>
<dependencies>
<!-- ftpcilent -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${ftpclient-version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
2.之后在Commons中添加两个工具类,FtpUtil是实现文件上传的相关工具,IDUtil是生成ID的相关工具。我们需要在src/main/resources中新建commons.properties,作用是写明我们上传服务器里面的配置。因为后面ftpUtils中是会用到的,这就避免了硬编码。之后,我们会在manage中用到这个属性文件,那么我们就需要在manage的配置文件中配置属性文件的扫描。
ftpclient.host = 192.168.189.130
ftpclient.port = 21
ftpclient.username = ftpuser
ftpclient.password = ftpuser
ftpclient.basepath = /home/ftpuser
ftpclient.filepath = /
<!-- 扫描 属性文件-->
<context:property-placeholder location="classpath:commons.properties"/>
3.接下来我们就需要在manage中添加对应的方法和实现类。我们文件上传是用kindeditor实现的,这个插件要求我们的返回值是一个Map类型,所以我们写出的如下代码(异常我们都丢给控制器处理):
public interface PicService {
/**
* 文件上传
*
*/
Map<String, Object> upload(MultipartFile file)throws IOException;
}
@Service
public class PicServiceImpl implements PicService {
//读取属性文件中的值,赋值给它们
@Value("${ftpclient.host}")
private String host;
@Value("${ftpclient.port}")
private int port;
@Value("${ftpclient.username}")
private String username;
@Value("${ftpclient.password}")
private String password;
@Value("${ftpclient.basepath}")
private String basePath;
@Value("${ftpclient.filepath}")
private String filePath;
@Override
public Map<String,Object> upload(MultipartFile file) throws IOException {
//IDUtils是生成一个图片名,后面的是读取到原来图片名的后缀
String genImageName = IDUtils.genImageName()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//调用工具,实现文件上传,返回一个boolean类型
boolean result = FtpUtil.uploadFile(host, port, username, password, basePath, filePath, genImageName, file.getInputStream());
Map<String,Object> map = new HashMap<>();
if(result){
//如果文件上传成功,返回true,则执行如下操作,
map.put("error", 0);
map.put("url","http://"+ host+"/"+genImageName);
}else{
map.put("error", 1);
map.put("message", "图片上传失败");
}
return map;
}
}
4.然后我们写出对应的控制器代码就可以了。这个里面就要处理异常了。
@Controller
public class PicController {
@Resource
private PicService picServiceImpl;
/**
* 图片上传
* @param uploadFile
* @return
*/
@RequestMapping("pic/upload")
@ResponseBody
public Map<String,Object> upload(MultipartFile uploadFile){
Map<String,Object> map = null;
try {
map= picServiceImpl.upload(uploadFile);
} catch (IOException e) {
e.printStackTrace();
map.put("error", 1);
map.put("message","上传图片时服务器异常");
}
return map;
}
}