1.上传多张图片

FastDFSUtil.upload方法

此处详情可以见之前的博客文件上传:

       FastDFS整合SpringBoot------文件上传、获取、下载、删除_Java-请多指教的博客

/**
     * 文件上传
     */
    public static String[] upload(FastDFSFile fastDFSFile) throws Exception {
        //创建一个Tracker访问的客户端对象TrackerClient
        TrackerClient trackerClient = new TrackerClient();
        //通过TrackerClient访问TrackerServer服务,获取连接信息
        TrackerServer trackerServer = trackerClient.getConnection();
        //通过TrackerServer的链接信息可以获取Storage的链接信息,创建StorageClient对象存储Storage的链接信息
        StorageClient storageClient = new StorageClient(trackerServer, null);
        /**
         * 通过StorageClient访问Storage,实现文件上传,并且获取文件上传后的存储信息
         * 三个参数:
         *    上传文件的字节数组
         *    文件的扩展名
         *    附加参数
         *
         */
        String[] uploads = storageClient.upload_file(fastDFSFile.getContent(), fastDFSFile.getExt(), null);
        /**
         * 返回的数组中
         *      [0];文件上传所存储的Storage 的组的名字   group1
         *      [1]:文件存储到Storage上的文件名字    M00/.....
         */

        return uploads;
    }

FastDFSFile 类

package com.changgou.file;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 封装文件上传信息:
 *      时间、上传人、类型、大小、附加信息、后缀、文件内容(文件的字节数组)。。。。
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FastDFSFile implements Serializable {
    //文件名字
    private String name;
    //文件内容
    private byte[] content;
    //文件扩展名
    private String ext;
    //文件MD5摘要值
    private String md5;
    //文件创建作者
    private String author;

    public FastDFSFile(String name, byte[] content, String ext) {
        this.name = name;
        this.content = content;
        this.ext = ext;
    }
}

 控制层

/**
     * 往相册里上传图片,可以多张
     * 然后修改数据库的相册管理中的相册图片地址字符串
     */
    @PostMapping("/uploadpictures")
    public Result uploadPictures(@RequestPart("file") MultipartFile[] multipartFiles,@RequestParam("id") Long albumid) throws Exception {
        if (multipartFiles.length > 0) {
            Album album = albumService.findById(albumid);
            //json字符串转对象
            List<ImageItems> list = JSON.parseArray(album.getImageItems(),ImageItems.class);
            //遍历多个图片
            for (MultipartFile multipartFile : multipartFiles) {
                FastDFSFile fastDFSFile = new FastDFSFile(
                        multipartFile.getOriginalFilename(),//文件名字  比如1.jpg
                        multipartFile.getBytes(), //文件字节数组
                        StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()) //获取文件扩展名
                );
                String[] upload = FastDFSUtil.upload(fastDFSFile);
                //拼接访问地址
                String url = "http://192.168.2.2/" + upload[0] + "/" + upload[1];
                System.out.println(url);
                //http://192.168.2.2/group1/M00/00/00/wKgCAmKS73qARZNqAAA9NPuNnTE298.jpg
                //http://192.168.2.2/group1/M00/00/00/wKgCAmKS73qAD7fSAAB3XDK5xZ4996.jpg
                //http://192.168.2.2/group1/M00/00/00/wKgCAmKS73qATLIrAAAsVKu8Jzg397.jpg
                ImageItems imageItems = new ImageItems();
                imageItems.setUrl(url);
                list.add(imageItems);
            }
            //集合转为json字符串
            String newpictures = JSON.toJSONString(list);
            System.out.println(newpictures);
            album.setImageItems(newpictures);
            albumService.uploadPictures(album);
            return new Result(true,StatusCode.OK,"上传"+multipartFiles.length+"张图片成功!!",newpictures);
        }
        return new Result(false,StatusCode.ERROR,"上传图片失败!!");

    }

postman测试

fastapi项目中指定mysql文件保存位置_文件上传

 查看数据库表

fastapi项目中指定mysql文件保存位置_json_02

2.删除多张图片

 FastDFSUtil.deleteFile方法

/**
     * 文件删除
     *
     * @param groupName:文件的组名
     * @param remoteFilename:文件的存储路径名
     * @throws Exception
     */
    public static void deleteFile(String groupName, String remoteFilename) throws Exception {
        TrackerClient trackerClient = new TrackerClient();
        TrackerServer trackerServer = trackerClient.getConnection();
        StorageClient storageClient = new StorageClient(trackerServer, null);
        //删除文件
        storageClient.delete_file(groupName, remoteFilename);
    }

controller层

/**
     * 删除相册中的图片,可多选删除
     */
    @PostMapping("/deletepictures")
    public Result deletePictures(@RequestParam("id") Long albumid, @RequestPart("url") String urls) throws Exception {

        //json字符串转为list1集合,集合中装的是ImageItems对象
        List<ImageItems> list1 = JSON.parseArray(urls, ImageItems.class);
        //查询指定相册中所有的图片地址,转为list2集合
        Album album = albumService.findById(albumid);
        List<ImageItems> list2 = JSON.parseArray(album.getImageItems(), ImageItems.class);

        //开始遍历集合然后执行删除操作,使用迭代器
        if (list1.size() > 0) {
            Iterator<ImageItems> iterator1 = list1.iterator();
            while (iterator1.hasNext()) {
                ImageItems imageItems1 = iterator1.next();
                //服务器删除
                String url = imageItems1.getUrl();
                int i = url.indexOf("group");//group首次出现的位置索引
                int j = url.indexOf("M");//M首次出现的位置索引
                String groupName = url.substring(i, j - 1);
                String remoteFilename = url.substring(j);
                FastDFSUtil.deleteFile(groupName, remoteFilename);
                Iterator<ImageItems> iterator2 = list2.iterator();
                while (iterator2.hasNext()) {
                    ImageItems imageItems2 = iterator2.next();
                    //数据库删除
                    if (imageItems1.getUrl().equals(imageItems2.getUrl())) {
                        iterator2.remove();
                    }
                }
            }
            String newpictures = JSON.toJSONString(list2);
            album.setImageItems(newpictures);
            albumService.deleteAlbumPictures(album);
            return new Result<>(true, StatusCode.OK, "删除" + list1.size() + "张图片成功!!!");
        }
        return null;
    }

postman测试 

fastapi项目中指定mysql文件保存位置_json字符串_03

 

 那两个图片地址已经访问不到了

fastapi项目中指定mysql文件保存位置_json_04

 

 数据库也更新了

fastapi项目中指定mysql文件保存位置_json字符串_05

 

 剩余的是可以访问到的!!

fastapi项目中指定mysql文件保存位置_文件上传_06

 

总结说明:

注意事项:

        1.json字符串转集合:使用JSON.parseArray(json字符串, 对应类.class)转成List<对应类>。

        2.集合遍历删除的时候记得使用迭代器方法,不要for循环,不然会出异常!!!

        3.嵌套迭代器循环的时候,不要在最外面获取迭代器,内层循环的迭代器应该在内存循环前一步获取。(之前我在外层循环外面一次性获取两个迭代器,结果内层循环只循坏了一次,第一次使用嵌套,失误了)

        4.list转回json字符串:JSON.toJSONString(集合);

        5.注意字符串的截取