Sfoglia il codice sorgente

添加用于文件下载接口

reghao 2 anni fa
parent
commit
b882d47de4

+ 6 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/controller/ObjectGetController.java

@@ -25,8 +25,12 @@ public class ObjectGetController {
     }
 
     @GetMapping(value = "/**")
-    public void getObject() throws IOException {
+    public void getObject(@RequestParam(value = "download", required = false) String download) throws IOException {
         String objectName = ObjectUtil.getObjectName();
-        getObjectService.getObject(objectName);
+        if (download == null) {
+            getObjectService.getObject(objectName);
+        } else {
+            getObjectService.downloadObject(objectName);
+        }
     }
 }

+ 28 - 1
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/MediaServiceImpl.java

@@ -1,8 +1,14 @@
 package cn.reghao.dfs.store.rpc;
 
+import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
 import cn.reghao.dfs.store.db.mapper.ImageFileMapper;
 import cn.reghao.dfs.store.db.mapper.VideoFileMapper;
+import cn.reghao.dfs.store.model.po.FileMeta;
+import cn.reghao.dfs.store.service.ObjectNameService;
+import cn.reghao.dfs.store.util.JwtUtil;
+import cn.reghao.oss.api.dto.DownloadUrl;
 import cn.reghao.oss.api.dto.ImageUrl;
+import cn.reghao.oss.api.dto.OssPayload;
 import cn.reghao.oss.api.dto.VideoInfo;
 import cn.reghao.oss.api.iface.MediaService;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -19,10 +25,15 @@ import java.util.List;
 public class MediaServiceImpl implements MediaService {
     private final ImageFileMapper imageFileMapper;
     private final VideoFileMapper videoFileMapper;
+    private final FileMetaMapper fileMetaMapper;
+    private final ObjectNameService objectNameService;
 
-    public MediaServiceImpl(ImageFileMapper imageFileMapper, VideoFileMapper videoFileMapper) {
+    public MediaServiceImpl(ImageFileMapper imageFileMapper, VideoFileMapper videoFileMapper,
+                            FileMetaMapper fileMetaMapper, ObjectNameService objectNameService) {
         this.imageFileMapper = imageFileMapper;
         this.videoFileMapper = videoFileMapper;
+        this.fileMetaMapper = fileMetaMapper;
+        this.objectNameService = objectNameService;
     }
 
     @Override
@@ -34,4 +45,20 @@ public class MediaServiceImpl implements MediaService {
     public List<ImageUrl> getImageUrls(List<String> imageFileIds) {
         return imageFileMapper.findImageUrls(imageFileIds);
     }
+
+    @Override
+    public DownloadUrl getDownloadUrl(String objectId, int channelId, long userId) {
+        FileMeta fileMeta = fileMetaMapper.findByObjectId(objectId);
+        String objectName = fileMeta.getObjectName();
+        String url = objectNameService.getObjectUrl(objectName);
+        String url1 = String.format("%s?download", url);
+
+        String action = "download";
+        long expireAt = System.currentTimeMillis() + 3600*1000;
+        // String signKey = RandomString.getSalt(64);
+        String signKey = "oss.reghao.cn";
+        OssPayload ossPayload = new OssPayload(action, channelId, userId);
+        String token = JwtUtil.createToken(ossPayload, expireAt, signKey);
+        return new DownloadUrl(url1, token);
+    }
 }

+ 59 - 2
dfs-store/src/main/java/cn/reghao/dfs/store/service/GetObjectService.java

@@ -1,12 +1,18 @@
 package cn.reghao.dfs.store.service;
 
+import cn.reghao.dfs.store.auth.AuthUser;
 import cn.reghao.dfs.store.config.OssProperties;
 import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
 import cn.reghao.dfs.store.db.repository.ObjectRepository;
 import cn.reghao.dfs.store.model.dto.ContentRange;
 import cn.reghao.dfs.store.model.po.FileMeta;
+import cn.reghao.dfs.store.util.JwtUtil;
+import cn.reghao.dfs.store.util.UserContext;
+import cn.reghao.jutil.jdk.result.WebResult;
+import cn.reghao.oss.api.constant.UploadChannel;
 import cn.reghao.oss.api.dto.ObjectMeta;
 import cn.reghao.jutil.web.ServletUtil;
+import cn.reghao.oss.api.dto.OssPayload;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -83,6 +89,55 @@ public class GetObjectService {
         }
     }
 
+    @AuthUser
+    public void downloadObject(String objectName) throws IOException {
+        String token = ServletUtil.getBearerToken();
+        if (token == null) {
+            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
+        }
+
+        OssPayload ossPayload = JwtUtil.getOssPayload(token);
+        String action = ossPayload.getAction();
+        if (!"download".equals(action)) {
+            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
+        }
+
+        int channelId1 = ossPayload.getChannelId();
+        String prefix = UploadChannel.getUploadChannel(channelId1).getPrefix();
+        if (!objectName.startsWith(prefix)) {
+            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
+        }
+
+        long userId1 = ossPayload.getUserId();
+        long userId = UserContext.getUser();
+        if (userId != userId1) {
+            writeResponse(HttpServletResponse.SC_UNAUTHORIZED);
+        }
+
+        String userAgent = ServletUtil.getRequest().getHeader("user-agent");
+        String host = ServletUtil.getRequest().getHeader("host");
+        HttpServletResponse response = ServletUtil.getResponse();
+
+        ObjectMeta objectMeta = objectRepository.getObjectMeta(objectName);
+        if (objectMeta == null) {
+            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+            OutputStream outputStream = response.getOutputStream();
+            outputStream.flush();
+            outputStream.close();
+            return;
+        }
+
+        writeDownloadContent(objectMeta);
+    }
+
+    private void writeResponse(int statusCode) throws IOException {
+        HttpServletResponse response = ServletUtil.getResponse();
+        response.setStatus(statusCode);
+        OutputStream outputStream = response.getOutputStream();
+        outputStream.flush();
+        outputStream.close();
+    }
+
     private ContentRange parseContentRange(String range, long len) {
         String rangeStr = StringUtils.trimAllWhitespace(range);
         String[] arr = rangeStr.replace("bytes=", "").split("-");
@@ -122,8 +177,10 @@ public class GetObjectService {
         /*response.setHeader("Content-Length", ""+(len-start));
         response.setHeader("Accept-Ranges", "bytes");
         response.setHeader("Content-Range", "bytes "+start+"-"+(len-1)+"/"+len);*/
-        response.setHeader("Content-Disposition", "attachment;filename=" +
-                URLEncoder.encode(objectMeta.getObjectName(), StandardCharsets.UTF_8.toString()));
+        String filename = fileMetaMapper.findByObjectId(objectMeta.getObjectId()).getFilename();
+        String value = String.format("attachment;filename=%s", URLEncoder.encode(filename, StandardCharsets.UTF_8.toString()));
+        response.setHeader("Content-Disposition", value);
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
 
         OutputStream outputStream = response.getOutputStream();
         writeResponse(outputStream, objectMeta.getAbsolutePath(), 0, objectMeta.getSize());