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

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

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

    /**
liqin's avatar
liqin committed
136
     * 删除文件
liqin's avatar
liqin committed
137
     */
liqin's avatar
liqin committed
138
    public static byte[] deleteFile(String fileUrl) {
liqin's avatar
liqin committed
139 140
        fileUrl = fileUrl.replace(dfsFileAccessBasePath + "/", "");
        String groupName = fileUrl.substring(0, fileUrl.indexOf("/"));
liqin's avatar
liqin committed
141
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
liqin's avatar
liqin committed
142
        return storageClient.downloadFile(groupName, path, new DownloadByteArray());
liqin's avatar
liqin committed
143 144
    }

liqin's avatar
liqin committed
145
    private static int[] getImageInfo(byte[] bytes) {
liqin's avatar
liqin committed
146
        try {
liqin's avatar
liqin committed
147 148
            ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
            BufferedImage image = ImageIO.read(baos);
liqin's avatar
liqin committed
149 150 151 152
            int width = image.getWidth();
            int height = image.getHeight();
            return new int[]{width, height};
        } catch (Exception e) {
liqin's avatar
liqin committed
153
            log.error("FastDFSUtils.getImageInfo() error:", e);
liqin's avatar
liqin committed
154 155 156 157
        }
        return new int[]{0, 0};
    }

liqin's avatar
liqin committed
158 159 160 161 162 163
    private static ByteArrayOutputStream translateToByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        IOUtils.copy(inputStream, out);
        return out;
    }

liqin's avatar
liqin committed
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
//    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
181

liqin's avatar
liqin committed
182
}