背景
上传资源图片,默认只可上传至服务器所有在机器目录。现需要增加ftp上传、下载功能
设计
首先考虑尽可能封装实现,即无论上传至本地或者FTP远程目录,都应该在调用层无感知
伪代码调用:
//上传单个文件
FileUpload.upload(MultipartFile file, String fileName);
//上传文件夹文件
FileUpload.uploadImgFile(String spath, String desPath)
//下载图片
FileUpload.downloadImg(String fileName, HttpServletResponse response);
//现在文件夹图片
FileUpload.downloadImgFile(String path);
考虑采用简单工厂及链式实现,如下
FileUpload.create().upload(xxx,xxx);
工厂create构造方法
public class FileUpload {
//创建工厂实例,通过create方法建造
public static IUpload create() {
if (FtpUpload.getEnable()) { //如果启用远程ftp上传
return new FtpUpload();
} else { //项目磁盘上传
return new LocalUpload();
}
}
//禁止外部new
private FileUpload(){};
}
初始考虑IUpload 为接口,但是考虑到本地【LocalUpload】无须实现download功能,本地资源可通过路由控制,所以最好能提供默认实现,幸好jdk1.8提供了接口默认方法实现。
public interface IUpload {
boolean upload(MultipartFile file, String fileName) throws IOException;
default void downloadImg(String fileName,HttpServletResponse response) throws IOException{
throw new IOException("暂未实现");
};
default void downloadImgFile(String path) throws IOException{
throw new IOException("暂未实现");
};
void uploadImgFile(String spath,String desPath) throws IOException;
}
本地代码类实现
public class LocalUpload implements IUpload {
@Override
public boolean upload(MultipartFile file, String destName) throws IOException {
File dest = new File(destName);
// 如果文件父目录不存在,则创建
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
return true;
}
@Override
public void uploadImgFile(String spath, String desPath) throws IOException {
FileUtils.copyDirectory(new File(spath), new File(desPath));
}
}
下面一章,重点讲解通过ftp实现上传、下载及遇到的问题
【特此声明:本文原创,禁止转载!觉得有用打赏一个吧】