1.上传多张图片
FastDFSUtil.upload方法
此处详情可以见之前的博客文件上传:
/**
* 文件上传
*/
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测试
查看数据库表
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测试
那两个图片地址已经访问不到了
数据库也更新了
剩余的是可以访问到的!!
总结说明:
注意事项:
1.json字符串转集合:使用JSON.parseArray(json字符串, 对应类.class)转成List<对应类>。
2.集合遍历删除的时候记得使用迭代器方法,不要for循环,不然会出异常!!!
3.嵌套迭代器循环的时候,不要在最外面获取迭代器,内层循环的迭代器应该在内存循环前一步获取。(之前我在外层循环外面一次性获取两个迭代器,结果内层循环只循坏了一次,第一次使用嵌套,失误了)
4.list转回json字符串:JSON.toJSONString(集合);
5.注意字符串的截取