前后端文件传输

前端传输文件经后端存入数据库,后端接收注意事项

文件上传前端代码:

整体思路:

前端点击上传图片,选中图片点击上传,通过action属性跳转地址访问后端服务器,后端通过MultipartFile类型接收文件,注意此时是输入流,后端接收获取文件名字,通过正则表达式判断文件类型,符合允许上传,不符合不允许上传;根据时间创建本地文件夹,通过uuid值重命名文件,最终返回。

后端实现思路:

a.定义本地存储地址
b.获取文件名称
c.利用正则判断是否为图片
d.检查文件是否为恶意程序
e.根据时间实现目录的创建  时间yyyy-mm-dd-hh
f.使用uuid替换文件名称,保证系统内部唯一
g.实现文件上传   目录/文件名

删除,上传图片后不想上传到数据库了,中途删除,点击删除后实现本地磁盘一起删除。

以上传图片为例:

 

后端代码:

定义一个接收文件上传请求的controller类,创建业务层接口以及实现类,实现代码:

@Service
@PropertySource("classpath:/image.properties")
public class FileServiceImpl implements FileService{
    //封装路径的前缀
    //定义本地存储地址
    @Value("${image.localDir}")
    private String localDir;    //= "J:/workspace/images";
    @Value("${image.preUrl}")
    private String preUrl;    //= "http://image.jt.com";

    /**
     * 1.校验是否为图片
     * 2.木马.exe.jpg 校验是否为恶意程序
     * 3.为了提高查询效率,要求分目录存储
     * 4.防止文件重名,使用UUID代替文件名称
     */
    @Override
    public ImageVO upload(MultipartFile file){
        //获取图片名称
        String fileName = file.getOriginalFilename();
        //利用正则表达式判断是否为图片
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            return null;
        }

        //检查文件是否为恶意程序
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            //通过图片固有长宽属性判断是否为图片
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width ==0 || height == 0){
                //说明不是照片
                return null;
            }

            //根据时间实现目录的创建  时间yyyy-mm-dd-hh
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            String localDirPath = localDir + dateDir;
            File dirFile = new File(localDirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //使用uuid替换文件名称
            //唯一:系统内部唯一
            String uuid = UUID.randomUUID().toString().replace("-", "");
            //截取文件后缀
            int index = fileName.lastIndexOf(".");
            //获取类型
            String fileType = fileName.substring(index);
            String newFileName = uuid + fileType;
            //实现文件上传   目录/文件名
            String readFilePath = localDirPath + newFileName;
            file.transferTo(new File(readFilePath));

            //封装返回值
            /**
             * 封装虚拟路径  在各个系统之间可以灵活切换,只保存动态变化的目录
             * path = 时间/uuid.type
             */
            String virtualPath = dateDir + newFileName;
            String urlPath =preUrl + virtualPath;
            System.out.println(readFilePath);
            System.out.println(urlPath);
            return new ImageVO(virtualPath,urlPath,newFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }


    }

    /**
     * 实现思路:
     *  1.根据虚拟地址,拼接磁盘地址
     *  2.判断文件是否存在
     *  3.实现文件删除
     * @param virtualPath
     */
    @Override
    public void deleteFile(String virtualPath) {
        String path = localDir + virtualPath;
        File file = new File(path);
        if(file.exists()){
            file.delete();
        }

    }
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值