文件上传案例

文件上传入门案例

1.1页面分析

1.2编译FileController

package com.jt.controller;
import com.jt.service.FileService;
import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileController {
 @Autowired
 private FileService fileService;
 /**
 * 文件上传的入门案例
 * url:http://localhost:8091/file
 * 参数: fileImage 名称
 * 返回值: 文件上传成功!!!
 * SpringMVC 提供了工具API 专门操作流文件.
 * * 文件上传的具体步骤:
 *  1.准备文件目录
 *  2.准备文件的全名 xxxx.jpg
 *  3.准备文件上传的路径 D:/JT-SOFT/images/xxxx.jpg
 *  4.将字节信息输出即可.
 * 大小不要超过1M
 */@RequestMapping("/file")
public String file(MultipartFile fileImage) throws IOException {
 String dirPath="D:/JT-SOFT/images";
 File dirFile = new File(dirPath);
 if (!dirFile.exists()){
 dirFile.mkdirs();
 }
//获取文件的名称
 String filename = fileImage.getOriginalFilename();
 //获取文件的全路径
 String filePath = dirPath +"/"+filename;
 File file= new File(filePath);
 fileImage.transferTo(file);//将自己额信息输出到指定的位置中
 return "文件上传成功";
}
/**
 * 实现文件上传
 * url地址:
 * 参数 uploadFile文件的字节信息
 * 返回值 {"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
 * 参数说明: 0代表是一张图片,如果是0,前台才可以解析并显示。1代表不是图片,
 * 不显示如果不设置宽度和高度,则默认用图片原来的大小,所以不用设置
 */
@RequestMapping("/pic/upload")
public ImageVO upload(MultipartFile uploadFile){
 return fileService.upload(uploadFile);
}
}

1.2文件上传的实现

1.2.1页面URL分析

文件上传案例_第1张图片

1.2.2准备ImageVO对象

package com.jt.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class ImageVO {

    //{"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
    private Integer error;  //错误信息   0程序运行正常    1.文件上传有误.
    private String url;     //图片访问的虚拟路径
    private Integer width;  // >0
    private Integer height; // >0

    //设定上传失败的方法
    public static ImageVO fail(){

        return new ImageVO(1,null,null,null);
    }

    public static ImageVO success(String url,Integer width,Integer height){

        return new ImageVO(0,url,width,height);
    }
}

1.2.3 编译FileController

 /**
     * 实现文件上传
     * url地址: http://localhost:8091/pic/upload?dir=image
     * 参数:    uploadFile: 文件的字节信息.
     * 返回值:  {"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
     *          ImageVO对象...
     */
    @RequestMapping("/pic/upload")
    public ImageVO upload(MultipartFile uploadFile){

        return fileService.upload(uploadFile);
    }

1.2.4 编译FileService

package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService{

    private String rootDirPath = "D:/JT-SOFT/images";

    //1.2 准备图片的集合  包含了所有的图片类型.
    private static Set imageTypeSet;
    static {
        imageTypeSet = new HashSet<>();
        imageTypeSet.add(".jpg");
        imageTypeSet.add(".png");
        imageTypeSet.add(".gif");
    }


    /**
     * 完善的校验的过程
     * 1. 校验是否为图片
     * 2. 校验是否为恶意程序
     * 3. 防止文件数量太多,分目录存储.
     * 4. 防止文件重名
     * 5. 实现文件上传.
     * @param uploadFile
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile uploadFile) {
        //1.校验图片类型  jpg|png|gif..JPG|PNG....
        //1.1 获取当前图片的名称 之后截取其中的类型.   abc.jpg
        String fileName = uploadFile.getOriginalFilename();
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);
        //将数据转化为小写
        fileType = fileType.toLowerCase();
        //1.3 判断图片类型是否正确.
        if(!imageTypeSet.contains(fileType)){
            //图片类型不匹配
            return ImageVO.fail();
        }

        //2.校验是否为恶意程序 根据宽度/高度进行判断
        try {
            //2.1 利用工具API对象 读取字节信息.获取图片对象类型
            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
            //2.2 校验是否有宽度和高度
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width==0 || height==0){
                return ImageVO.fail();
            }

            //3.分目录存储  yyyy/MM/dd 分隔
            //3.1 将时间按照指定的格式要求 转化为字符串.
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                             .format(new Date());
            //3.2 拼接文件存储的目录对象
            String fileDirPath = rootDirPath + dateDir;
            File dirFile = new File(fileDirPath);
            //3.3 动态创建目录
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //4.防止文件重名  uuid.jpg 动态拼接
            //4.1 动态生成uuid  实现文件名称拼接  名.后缀
            String uuid =
                    UUID.randomUUID().toString().replace("-", "");
            String realFileName = uuid + fileType;

            //5 实现文件上传
            //5.1 拼接文件真实路径 dir/文件名称.
            String realFilePath = fileDirPath + realFileName;
            //5.2 封装对象  实现上传
            File realFile = new File(realFilePath);
            uploadFile.transferTo(realFile);

            //实现文件上传成功!!!!
            String url = "https://img14.360buyimg.com/n0/jfs/t1/45882/22/7027/53284/5d49358aE9c25c1bd/fb7365463f6a1a7b.jpg";
            //这里是表明上传成功后页面返回的结果,是一个固定图片
            return ImageVO.success(url,width,height);
        } catch (IOException e) {
            e.printStackTrace();
            return ImageVO.fail();
        }
    }
}

2.1文件上传的优化

1.1url的优化

说明: 如果需要通过网络虚拟路径访问服务器.则应该按照如下的配置实现.
1.本地磁盘路径:D:/JT-SOFT/images/2020/10/03/a.jpg
2.网路虚拟路径: http://image.jt.com/2020/10/0...

1.2 编辑pro配置文件

文件上传案例_第2张图片

1.3 完成属性的动态赋值

package com.jt.service;
import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Service
@PropertySource("classpath:/properties/images.properties") //容器动态加载指定的配置文件
public class FileServiceImpl implements FileService{
    //由于属性的值后期可能会发生变化,所以应该动态的获取属性数据. 利用pro配置文件
 @Value("${image.rootDirPath}")
    private String rootDirPath;             //   = "D:/JT-SOFT/images";
 @Value("${image.urlPath}")
    private String urlPath;                 // = "http://image.jt.com";
 //1.2 准备图片的集合  包含了所有的图片类型. private static Set imageTypeSet;
    static {
        imageTypeSet = new HashSet<>();
        imageTypeSet.add(".jpg");
        imageTypeSet.add(".png");
        imageTypeSet.add(".gif");
    }
    /**
 * 完善的校验的过程 * 1. 校验是否为图片 * 2. 校验是否为恶意程序 * 3. 防止文件数量太多,分目录存储. * 4. 防止文件重名 * 5. 实现文件上传. * @param uploadFile
 * @return
 */
 @Override
 public ImageVO upload(MultipartFile uploadFile) {
        //0.防止有多余的空格 所以先做去空格的处理
 rootDirPath.trim();
        urlPath.trim();
        //1.校验图片类型  jpg|png|gif..JPG|PNG....
 //1.1 获取当前图片的名称 之后截取其中的类型.   abc.jpg String fileName = uploadFile.getOriginalFilename();
        int index = fileName.lastIndexOf(".");//从最后一个.向后搜索
 String fileType = fileName.substring(index);//将搜索出的内容截取
 //将数据转化为小写 fileType = fileType.toLowerCase();
        //1.3 判断图片类型是否正确.
 if(!imageTypeSet.contains(fileType)){
            //图片类型不匹配
 return ImageVO.fail();
        }
        //2.校验是否为恶意程序 根据宽度/高度进行判断
 try {
            //2.1 利用工具API对象 读取字节信息.获取图片对象类型
 BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
            //2.2 校验是否有宽度和高度
 int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width==0 || height==0){
                return ImageVO.fail();
            }
            //3.分目录存储  yyyy/MM/dd 分隔
 //3.1 将时间按照指定的格式要求 转化为字符串. String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                    .format(new Date());
            //3.2 拼接文件存储的目录对象
 String fileDirPath = rootDirPath + dateDir;
            File dirFile = new File(fileDirPath);
            //3.3 动态创建目录
 if(!dirFile.exists()){
                dirFile.mkdirs();
            }
            //4.防止文件重名  uuid.jpg 动态拼接
 //4.1 动态生成uuid  实现文件名称拼接  名.后缀 String uuid =
                    UUID.randomUUID().toString().replace("-", "");
            String realFileName = uuid + fileType;
            //5 实现文件上传
 //5.1 拼接文件真实路径 dir/文件名称. String realFilePath = fileDirPath + realFileName;
            //5.2 封装对象  实现上传
 File realFile = new File(realFilePath);
            uploadFile.transferTo(realFile);
            //实现文件上传成功!!! http://image.jt.com20200930a.jpg
 String url = urlPath + dateDir + realFileName;
            return ImageVO.success(url,width,height);
        } catch (IOException e) {
            e.printStackTrace();
            return ImageVO.fail();
        }
    }
}

3.页面展示的效果

文件上传案例_第3张图片

你可能感兴趣的:(java,程序员)