FastDFSUtils.java 7.5 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 5 6
import cn.wisenergy.chnmuseum.party.common.util.CopyStreamUtils;
import cn.wisenergy.chnmuseum.party.common.util.FileTypeUtil;
import cn.wisenergy.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 11
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
12
import com.github.tobato.fastdfs.domain.proto.storage.DownloadFileStream;
liqin's avatar
liqin committed
13
import com.github.tobato.fastdfs.exception.FdfsServerException;
liqin's avatar
liqin committed
14 15
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
liqin's avatar
liqin committed
16
import org.apache.commons.io.FilenameUtils;
liqin's avatar
liqin committed
17
import org.apache.commons.io.IOUtils;
liqin's avatar
liqin committed
18
import org.springframework.beans.factory.annotation.Value;
liqin's avatar
liqin committed
19
import org.springframework.stereotype.Component;
liqin's avatar
liqin committed
20

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

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

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

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

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

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

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

liqin's avatar
liqin committed
71 72 73 74 75 76
    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
77 78 79
        Map<String, Object> map = CopyStreamUtils.copyInputStream(inputStream);
        String md5 = (String) map.get("md5");
        metaDataSet.add(new MetaData("MD5", md5));
liqin's avatar
liqin committed
80
        InputStream is = (InputStream) map.get("inputStream");
liqin's avatar
liqin committed
81
        final StorePath storePath = storageClient.uploadFile(is, size, FilenameUtils.getExtension(fileName), metaDataSet);
liqin's avatar
liqin committed
82
        return dfsFileAccessBasePath + "/" + storePath.getFullPath();
liqin's avatar
liqin committed
83 84
    }

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

liqin's avatar
liqin committed
116 117 118 119 120 121 122 123 124 125 126
    /**
     * 下载文件(字节数组)
     * @return
     */
    public static BufferedInputStream downloadFile(String fileUrl, OutputStream outputStream) {
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        return storageClient.downloadFile(groupName, path, new DownloadFileStream(outputStream));
    }

liqin's avatar
liqin committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
    /**
     * 下载文件
     *
     * @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
142 143 144
    }

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

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

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

liqin's avatar
liqin committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
//    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
190

liqin's avatar
liqin committed
191
}