|
|
@@ -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());
|