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

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

liqin's avatar
liqin committed
20 21
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
liqin's avatar
liqin committed
22 23
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
liqin's avatar
liqin committed
24
import java.io.*;
liqin's avatar
liqin committed
25 26 27
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
liqin's avatar
liqin committed
28

liqin's avatar
liqin committed
29
@Slf4j
liqin's avatar
liqin committed
30
@Component
liqin's avatar
liqin committed
31 32
public class FastDFSUtils {

liqin's avatar
liqin committed
33
    private static String dfsFileAccessBasePath;
liqin's avatar
liqin committed
34 35
    private static ThumbImageConfig imageConfig;
    private static FastFileStorageClient storageClient;
liqin's avatar
liqin committed
36 37

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

liqin's avatar
liqin committed
42 43 44 45
    @Resource
    private ThumbImageConfig thumbImageConfig;
    @Resource
    private FastFileStorageClient fastFileStorageClient;
liqin's avatar
liqin committed
46

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

liqin's avatar
liqin committed
53
    public static Map<String, Object> uploadUeImage(InputStream inputStream, long fileSize, String fileName) {
liqin's avatar
liqin committed
54 55 56
        boolean isImage = FileTypeUtil.isImageByExtension(fileName);
        if (isImage) {
            String mimeType = FileUtil.getMimeType(fileName);
liqin's avatar
liqin committed
57
            final String storePath = FastDFSUtils.uploadFile(inputStream, fileSize, fileName, null);
liqin's avatar
liqin committed
58
            Map<String, Object> uploadResult = new HashMap<>();
liqin's avatar
liqin committed
59
            uploadResult.put("url", storePath);
liqin's avatar
liqin committed
60 61 62 63 64 65
            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
66
        }
liqin's avatar
liqin committed
67
        throw new InterfaceException("400", "文件不是图片类型");
liqin's avatar
liqin committed
68 69
    }

liqin's avatar
liqin committed
70 71 72 73 74 75
    public static String uploadFile(InputStream inputStream, long size, String fileName, Set<MetaData> metaDataSet) {
        final StorePath storePath = storageClient.uploadFile(inputStream, size, FilenameUtils.getExtension(fileName), metaDataSet);
        return dfsFileAccessBasePath + "/" + storePath.getFullPath();
    }

    public static String uploadVideo(InputStream inputStream, long size, String fileName, Set<MetaData> metaDataSet) {
liqin's avatar
liqin committed
76 77 78
        Map<String, Object> map = CopyStreamUtils.copyInputStream(inputStream);
        String md5 = (String) map.get("md5");
        metaDataSet.add(new MetaData("MD5", md5));
liqin's avatar
liqin committed
79
        InputStream is = (InputStream) map.get("inputStream");
liqin's avatar
liqin committed
80
        final StorePath storePath = storageClient.uploadFile(is, size, FilenameUtils.getExtension(fileName), metaDataSet);
liqin's avatar
liqin committed
81
        return dfsFileAccessBasePath + "/" + storePath.getFullPath();
liqin's avatar
liqin committed
82 83
    }

liqin's avatar
liqin committed
84 85 86 87
    /**
     * 使用 FastDFS 提供的客户端 storageClient 来进行文件上传,最后将上传结果返回。
     * 根据 groupName 和文件名获取文件信息。
     */
liqin's avatar
liqin committed
88 89 90 91
    public static FileInfo getFileInfo(String fileUrl) {
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
liqin's avatar
liqin committed
92 93 94 95 96 97 98 99 100 101 102 103 104
        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
105
    /**
liqin's avatar
liqin committed
106
     * 下载文件(字节数组)
liqin's avatar
liqin committed
107
     */
liqin's avatar
liqin committed
108
    public static void downloadFile(String fileUrl, OutputStream outputStream) {
liqin's avatar
liqin committed
109 110 111
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
liqin's avatar
liqin committed
112
        storageClient.downloadFile(groupName, path, new DownloadFileStream(outputStream));
liqin's avatar
liqin committed
113 114
    }

liqin's avatar
liqin committed
115 116 117
    /**
     * 下载文件
     */
liqin's avatar
liqin committed
118
    public static InputStream downloadFile(String filePath) {
liqin's avatar
liqin committed
119
        try {
liqin's avatar
liqin committed
120 121
            StorePath storePath = StorePath.parseFromUrl(filePath);
            return storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), inputStream -> inputStream);
liqin's avatar
liqin committed
122 123 124 125 126
        } catch (FdfsServerException e) {
            //不起作用
            log.error("文件不存在,下载失败:" + e.getErrorCode());
            throw new InterfaceException("文件不存在,下载失败:" + e.getErrorCode());
        }
liqin's avatar
liqin committed
127 128 129
    }

    /**
liqin's avatar
liqin committed
130
     * 删除文件
liqin's avatar
liqin committed
131
     */
liqin's avatar
liqin committed
132 133 134
    public static void deleteFile(String filePath) {
        StorePath storePath = StorePath.parseFromUrl(filePath);
        storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
liqin's avatar
liqin committed
135 136
    }

liqin's avatar
liqin committed
137
    private static int[] getImageInfo(byte[] bytes) {
liqin's avatar
liqin committed
138
        try {
liqin's avatar
liqin committed
139 140
            ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
            BufferedImage image = ImageIO.read(baos);
liqin's avatar
liqin committed
141 142 143 144
            int width = image.getWidth();
            int height = image.getHeight();
            return new int[]{width, height};
        } catch (Exception e) {
liqin's avatar
liqin committed
145
            log.error("FastDFSUtils.getImageInfo() error:", e);
liqin's avatar
liqin committed
146 147 148 149
        }
        return new int[]{0, 0};
    }

liqin's avatar
liqin committed
150
    public static InputStream translateToByteArray(InputStream inputStream) throws IOException {
liqin's avatar
liqin committed
151 152
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, out);
liqin's avatar
liqin committed
153
        return new ByteArrayInputStream(out.toByteArray());
liqin's avatar
liqin committed
154 155
    }

liqin's avatar
liqin committed
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
//    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
173

liqin's avatar
liqin committed
174
}