diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ProxyController.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ProxyController.java index be56b8c..a0e6b17 100644 --- a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ProxyController.java +++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ProxyController.java @@ -13,6 +13,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -49,9 +50,9 @@ public class ProxyController { } @GetMapping("/file/read/do") - @PreAuthorize("@ss.hasPermission('crm:proxy:all')") + @PermitAll @Operation(summary = "获取图片") - public byte[] proxyRead(@RequestParam String fileId, @RequestParam boolean isTemp) throws IOException, URISyntaxException, AllKingdeeException { - return proxyService.dpGetImage(fileId, isTemp); + public void proxyRead(@RequestParam String fileId, @RequestParam boolean isTemp, HttpServletResponse response) { + proxyService.doGetImage(fileId, isTemp, response); } } diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/ImageStorage.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/ImageStorage.java new file mode 100644 index 0000000..14872b6 --- /dev/null +++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/ImageStorage.java @@ -0,0 +1,20 @@ +package com.ensign.crm.module.crm.model; + +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import org.springframework.boot.context.properties.ConstructorBinding; + +/** + * @Description: TODO + * @Date: 2024/9/29 9:36 + * @Created: by ZZSLL + */ + +@Data +public class ImageStorage { + private String fileName; + private Long fileSize; + private String mediaType; + private String fileContent; +} diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ImageService.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ImageService.java index aee81c7..01d8ea5 100644 --- a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ImageService.java +++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ImageService.java @@ -1,17 +1,16 @@ package com.ensign.crm.module.crm.service; +import com.ensign.crm.module.crm.model.ImageStorage; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; @@ -27,7 +26,7 @@ import java.util.concurrent.TimeUnit; public class ImageService { @Resource - private RedisTemplate<String, byte[]> redisTemplate; + private RedisTemplate<String, ImageStorage> redisTemplate; private final String CACHE_PREFIX = "kingdee:temp_file"; @@ -46,11 +45,11 @@ public class ImageService { } } - public void saveImage(String key, byte[] imageData) { + public void saveImage(String key, ImageStorage imageData) { redisTemplate.opsForValue().set(CACHE_PREFIX + key, imageData, 2, TimeUnit.HOURS); } - public byte[] getImage(String key) { + public ImageStorage getImage(String key) { return redisTemplate.opsForValue().get(CACHE_PREFIX + key); } } diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ProxyService.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ProxyService.java index 5af1462..d01762b 100644 --- a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ProxyService.java +++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ProxyService.java @@ -1,10 +1,12 @@ package com.ensign.crm.module.crm.service; +import cn.hutool.core.codec.Base64; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ensign.crm.module.crm.exception.AllKingdeeException; +import com.ensign.crm.module.crm.model.ImageStorage; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; @@ -24,19 +26,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.MediaTypeFactory; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Service; +import org.springframework.util.MimeType; import org.springframework.util.StreamUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.util.*; @@ -168,7 +172,8 @@ public class ProxyService { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(newUri); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.addPart("file", new FileBody(transferToFile(file))); + FileBody fileBody = new FileBody(transferToFile(file)); + builder.addPart("file", fileBody); HttpEntity multipartEntity = builder.build(); httpPost.setEntity(multipartEntity); HttpResponse kResponse = httpClient.execute(httpPost); @@ -180,12 +185,29 @@ public class ProxyService { String fileId = extractFileId(url); String downloadUrl = url + "&access_token=" + initAccessToken(); byte[] bytes = imageService.downloadImage(downloadUrl); - imageService.saveImage(fileId, bytes); + ImageStorage imageStorage = new ImageStorage(); + + imageStorage.setMediaType(getFileMediaType(fileBody.getFilename())); + imageStorage.setFileName(fileBody.getFilename()); + imageStorage.setFileSize(fileBody.getContentLength()); + imageStorage.setFileContent(transformToBase64(bytes)); + + imageService.saveImage(fileId, imageStorage); return doConvertFileUrl(fileId, true); } return null; } + private String getFileMediaType(String filename) { + Optional<MediaType> mediaType = MediaTypeFactory.getMediaType(filename); + return mediaType.map(MimeType::toString).orElse(""); + } + + + private String transformToBase64(byte[] file) { + return Base64.encode(file); + } + private String extractFileId(String url) throws AllKingdeeException, URISyntaxException { URI uri = new URI(url); String query = uri.getQuery(); @@ -378,10 +400,23 @@ public class ProxyService { return ""; } - public byte[] dpGetImage(String fileId, boolean isTemp) { + public void doGetImage(String fileId, boolean isTemp, HttpServletResponse response) { if (isTemp) { - return imageService.getImage(fileId); + ImageStorage image = imageService.getImage(fileId); + byte[] bytes = Base64.decode(image.getFileContent()); + + try { + response.setContentType(image.getMediaType()); + response.setContentLength(image.getFileSize().intValue()); + response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFileName() + "\""); + + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.write(bytes); + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } } - return null; } }