FastDFSUtils.java 7.44 KB
Newer Older
liqin's avatar
liqin committed
1 2
package cn.wisenergy.chnmuseum.party.common.dfs;

liqin's avatar
liqin committed
3
import cn.wisenergy.chnmuseum.party.common.mvc.InterfaceException;
liqin's avatar
liqin committed
4
import cn.wisenergy.chnmuseum.party.common.util.*;
liqin's avatar
liqin committed
5 6
import com.github.tobato.fastdfs.domain.fdfs.FileInfo;
import com.github.tobato.fastdfs.domain.fdfs.MetaData;
liqin's avatar
liqin committed
7 8 9
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.fdfs.ThumbImageConfig;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
liqin's avatar
liqin committed
10
import com.github.tobato.fastdfs.exception.FdfsServerException;
liqin's avatar
liqin committed
11 12
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
liqin's avatar
liqin committed
13
import org.apache.commons.io.FilenameUtils;
liqin's avatar
liqin committed
14
import org.apache.commons.io.IOUtils;
liqin's avatar
liqin committed
15
import org.springframework.beans.factory.annotation.Value;
liqin's avatar
liqin committed
16
import org.springframework.stereotype.Component;
liqin's avatar
liqin committed
17

liqin's avatar
liqin committed
18 19
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
liqin's avatar
liqin committed
20 21
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
liqin's avatar
liqin committed
22
import java.io.ByteArrayInputStream;
liqin's avatar
liqin committed
23 24
import java.io.ByteArrayOutputStream;
import java.io.IOException;
liqin's avatar
liqin committed
25
import java.io.InputStream;
liqin's avatar
liqin committed
26
import java.time.LocalDateTime;
liqin's avatar
liqin committed
27 28 29 30
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
liqin's avatar
liqin committed
31

liqin's avatar
liqin committed
32
@Slf4j
liqin's avatar
liqin committed
33
@Component
liqin's avatar
liqin committed
34 35
public class FastDFSUtils {

liqin's avatar
liqin committed
36
    private static String dfsFileAccessBasePath;
liqin's avatar
liqin committed
37 38
    private static ThumbImageConfig imageConfig;
    private static FastFileStorageClient storageClient;
liqin's avatar
liqin committed
39 40

    @Value("${dfsFileAccessBasePath:#{null}}")
liqin's avatar
liqin committed
41
    public void setDfsFileAccessBasePath(String dfsFileAccessBasePath) {
liqin's avatar
liqin committed
42 43 44
        FastDFSUtils.dfsFileAccessBasePath = dfsFileAccessBasePath;
    }

liqin's avatar
liqin committed
45 46 47 48
    @Resource
    private ThumbImageConfig thumbImageConfig;
    @Resource
    private FastFileStorageClient fastFileStorageClient;
liqin's avatar
liqin committed
49

liqin's avatar
liqin committed
50 51 52 53
    @PostConstruct
    public void init() {
        FastDFSUtils.storageClient = fastFileStorageClient;
        FastDFSUtils.imageConfig = thumbImageConfig;
liqin's avatar
liqin committed
54 55
    }

liqin's avatar
liqin committed
56 57
    public static String uploadFile(InputStream inputStream, long size, String fileName) {
        final Set<MetaData> metaDataSet = new HashSet<>();
liqin's avatar
liqin committed
58
        metaDataSet.add(new MetaData("fileName", fileName));
liqin's avatar
liqin committed
59 60
        metaDataSet.add(new MetaData("fileSize", size + ""));
        metaDataSet.add(new MetaData("fileExtName", FilenameUtils.getExtension(fileName)));
liqin's avatar
liqin committed
61
        metaDataSet.add(new MetaData("updateTime", TimeUtils.format(LocalDateTime.now(), TimeUtils.FORMAT_ONE)));
liqin's avatar
liqin committed
62 63 64 65 66
        final StorePath storePath = storageClient.uploadFile(inputStream, size, FilenameUtils.getExtension(fileName), metaDataSet);
        return dfsFileAccessBasePath + "/" + storePath.getFullPath();
    }

    public static Map<String, Object> uploadUeImage(InputStream inputStream, long fileSize, String fileName) {
liqin's avatar
liqin committed
67 68 69 70 71 72 73 74 75 76 77 78
        boolean isImage = FileTypeUtil.isImageByExtension(fileName);
        if (isImage) {
            String mimeType = FileUtil.getMimeType(fileName);
            final String storePath = FastDFSUtils.uploadFile(inputStream, fileSize, fileName);
            Map<String, Object> uploadResult = new HashMap<>();
            uploadResult.put("url", dfsFileAccessBasePath + "/" + storePath);
            uploadResult.put("status", true);
            uploadResult.put("message", "文件上传成功!");
            uploadResult.put("title", fileName);
            uploadResult.put("mimeType", mimeType);
            uploadResult.put("size", fileSize);
            return uploadResult;
liqin's avatar
liqin committed
79
        }
liqin's avatar
liqin committed
80
        throw new InterfaceException("400", "文件不是图片类型");
liqin's avatar
liqin committed
81 82
    }

liqin's avatar
liqin committed
83
    public static String uploadVideo(InputStream inputStream, long size, String fileName) {
liqin's avatar
liqin committed
84 85 86 87
        Map<String, Object> map = CopyStreamUtils.copyInputStream(inputStream);
        String md5 = (String) map.get("md5");
        InputStream is = (InputStream) map.get("inputStream");

liqin's avatar
liqin committed
88
        final Set<MetaData> metaDataSet = new HashSet<>();
liqin's avatar
liqin committed
89
        metaDataSet.add(new MetaData("fileName", fileName));
liqin's avatar
liqin committed
90
        metaDataSet.add(new MetaData("fileSize", size + ""));
liqin's avatar
liqin committed
91
        metaDataSet.add(new MetaData("updateTime", TimeUtils.format(LocalDateTime.now(), TimeUtils.FORMAT_ONE)));
liqin's avatar
liqin committed
92 93
        metaDataSet.add(new MetaData("MD5", md5));
        final StorePath storePath = storageClient.uploadFile(is, size, FilenameUtils.getExtension(fileName), metaDataSet);
liqin's avatar
liqin committed
94
        return dfsFileAccessBasePath + "/" + storePath.getFullPath();
liqin's avatar
liqin committed
95 96
    }

liqin's avatar
liqin committed
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
    /**
     * 使用 FastDFS 提供的客户端 storageClient 来进行文件上传,最后将上传结果返回。
     * 根据 groupName 和文件名获取文件信息。
     *
     * @param groupName
     * @param path
     * @return
     */
    public static FileInfo getFileInfo(String groupName, String path) {
        return storageClient.queryFileInfo(groupName, path);
    }

    /**
     * 根据 groupName 和文件名获取文件信息。
     */
    public static Set<MetaData> getFileMetaData(String fileUrl) {
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        return storageClient.getMetadata(groupName, path);
    }

liqin's avatar
liqin committed
119
    /**
liqin's avatar
liqin committed
120
     * 下载文件(字节数组)
liqin's avatar
liqin committed
121
     */
liqin's avatar
liqin committed
122
    public static byte[] downloadFile(String fileUrl) {
liqin's avatar
liqin committed
123 124
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
liqin's avatar
liqin committed
125
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
liqin's avatar
liqin committed
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        return storageClient.downloadFile(groupName, path, new DownloadByteArray());
    }

    /**
     * 下载文件
     *
     * @param groupName
     * @param path
     * @return
     */
    public static InputStream deleteFile(String groupName, String path) {
        try {
            return storageClient.downloadFile(groupName, path, inputStream -> inputStream);
        } catch (FdfsServerException e) {
            //不起作用
            log.error("文件不存在,下载失败:" + e.getErrorCode());
            throw new InterfaceException("文件不存在,下载失败:" + e.getErrorCode());
        }
liqin's avatar
liqin committed
144 145 146
    }

    /**
liqin's avatar
liqin committed
147
     * 删除文件
liqin's avatar
liqin committed
148
     */
liqin's avatar
liqin committed
149 150 151 152
    public static byte[] deleteFile(String fileUrl) {
        String group = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        return storageClient.downloadFile(group, path, new DownloadByteArray());
liqin's avatar
liqin committed
153 154
    }

liqin's avatar
liqin committed
155
    private static int[] getImageInfo(byte[] bytes) {
liqin's avatar
liqin committed
156
        try {
liqin's avatar
liqin committed
157 158
            ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
            BufferedImage image = ImageIO.read(baos);
liqin's avatar
liqin committed
159 160 161 162
            int width = image.getWidth();
            int height = image.getHeight();
            return new int[]{width, height};
        } catch (Exception e) {
liqin's avatar
liqin committed
163
            log.error("FastDFSUtils.getImageInfo() error:", e);
liqin's avatar
liqin committed
164 165 166 167
        }
        return new int[]{0, 0};
    }

liqin's avatar
liqin committed
168 169 170 171 172 173
    private static ByteArrayOutputStream translateToByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, out);
        return out;
    }

liqin's avatar
liqin committed
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
//    private static class UploadFileSender implements UploadCallback {
//        private final InputStream is;
//
//        public UploadFileSender(InputStream is) {
//            this.is = is;
//        }
//
//        @Override
//        public int send(OutputStream out) throws IOException {
//            byte[] b = new byte[1024];
//            int readBytes;
//            while ((readBytes = is.read(b)) != -1) {
//                out.write(b, 0, readBytes);
//            }
//            return 0;
//        }
//    }
liqin's avatar
liqin committed
191

liqin's avatar
liqin committed
192
}