实现的思路:
- 判断是否为图片的类型(jpg|png|gif)
- 判断是否为恶意的程序
- 准备本地磁盘路径用来保存图片信息
file:///C:/Users/LYJ/Pictures/Saved%20Pictures/%E6%89%8B%E6%9C%BA/5a0aa9abNde6ea381.jpg
- 准备网络的请求路径(虚拟路径)
https://img10.360buyimg.com/devfe/jfs/t7507/196/1481278321/1134/d2c81887/599d3334Nf16495a3.gif
- 创建本地文件夹用来保存图片信息
- 尽可能让图片不重名
图片名称+时间毫秒
图片名称+时间毫秒+3位随机数
- 提高操作系统的执行效率
会根据当前时间实现创建不同的文件夹一般按照yyyy/MM/dd/HH
- 写盘操作
文件上传代码实现:
- 页面JS
<td>
<a href="javascript:void(0)" class="easyui-linkbutton picFileUpload">上传图片</a>
<input type="hidden" name="image"/>
</td>
var TT = KindEditorUtil = { //相当于java中定义的工具类,里面提供了很多静态方法。
// 编辑器参数
kingEditorParams : {
filePostName : "uploadFile", //文件上传的参数名称
uploadJson : '/pic/upload', //文件上传的路径
dir : "image"
},
- 文件上传返回值格式
{"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
参数说明: 0代表是一张图片,如果是0,前台才可以解析并显示。1代表不是图片,
不显示如果不设置宽度和高度,则默认用图片原来的大小,所以不用设置
代码实现:
@Service
public class FileUploadServiceImpl implements FileUploadService{
private String dirPath = "E:/jt-upload/"; //定义本地磁盘路径
private String url = "http://image.jt.com/";//定义url访问路径
/**
* 编程思路:
* 1.获取图片的名称
* 2.截取图片的类型
* 3.判断是否为图片格式jpg|gif|png
* 4.判断是否为恶意程序
* 5.定义磁盘路径和url访问路径
* 6.准备以时间为界限的文件夹
* 7.让图片不重名 时间毫秒数+三位数据数
* 8.创建文件夹
* 9.开始写盘操作
* 10.将数据准备好返回给客户端
*
* 真实路径:
* E:/jt-upload/2018/1/17/12/123.jpg
* 虚拟路径:
* http://image.jt.com/2018/1/17/12/123.jpg
*
*/
@Override
public PicUploadResult uploadFile(MultipartFile uploadFile) {
PicUploadResult result = new PicUploadResult();
//1.获取图片名称 aaa.jpg
String fileName = uploadFile.getOriginalFilename();
//2.获取图片的类型 -----.jpg
String fileType =
fileName.substring(fileName.lastIndexOf("."));
//3.判断是否为图片格式 采用正则表达式
if(!fileType.matches("^.*(jpg|png|gif)$")){
//表示不是图片类型
result.setError(1);
return result; //如果程序出错 则直接返回对象
}
//4.判断是否为恶意程序
/**
* 判断一个文件是否为图片一般获取图片的高度和宽度
* 如果二者都不为0则表示文件为图片
*/
//4.1 通过工具类判断是否为图片
try {
BufferedImage bufferedImage =
ImageIO.read(uploadFile.getInputStream());
//4.2 获取图片的高度和宽度
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width ==0 || height == 0){
result.setError(1); //表示非法程序
return result;
}
//6.准备时间文件夹 并且时间格式 yyyy/MM/dd/HH
String datePathDir =
new SimpleDateFormat("yyyy/MM/dd/HH").format(new Date());
//7.准备时间 时间毫秒数+三位随机数
String millis = System.currentTimeMillis()+"";
Random random = new Random();
int randomNum = random.nextInt(999); //0-999的随机数
String randomPath = millis+randomNum;
//8.创建文件夹
//E:/jt-upload/yyyy/MM/dd/HH
String LocalPath = dirPath + datePathDir;
File file = new File(LocalPath);
if(!file.exists()){
file.mkdirs(); //如果文件夹不存在 则创建文件夹
}
//8 通过工具类实现写盘操作
//E:/jt-upload/yyyy/MM/dd/HH/232323111ll.jpg
String LocalPathFile
= LocalPath + "/" + randomPath + fileName;
//文件写盘 ccc/asdfasdfsfadfsss.jpg
uploadFile.transferTo(new File(LocalPathFile));
//10.准备数据返回给客户端
result.setHeight(height+"");
result.setWidth(width+"");
//代表虚拟的全路径
String urlPath = url + datePathDir+"/" + randomPath + fileName;
result.setUrl(urlPath);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}