ソースを参照

增强导出文件的兼容性,解决某些情况导出的文件格式不正确的问题

jmxd 2 年 前
コミット
8d848d8ee1

+ 10 - 0
magic-api-servlet/magic-api-servlet-jakarta/src/main/java/org/ssssssss/magicapi/servlet/jakarta/MagicJakartaHttpServletResponse.java

@@ -42,6 +42,16 @@ public class MagicJakartaHttpServletResponse implements MagicHttpServletResponse
 		response.addCookie(cookie.getCookie());
 	}
 
+	@Override
+	public void setContentType(String contentType) {
+		response.setContentType(contentType);
+	}
+
+	@Override
+	public void setCharacterEncoding(String characterEncoding) {
+		response.setCharacterEncoding(characterEncoding);
+	}
+
 	@Override
 	public OutputStream getOutputStream() throws IOException {
 		return response.getOutputStream();

+ 10 - 0
magic-api-servlet/magic-api-servlet-javaee/src/main/java/org/ssssssss/magicapi/servlet/javaee/MagicJavaEEHttpServletResponse.java

@@ -42,6 +42,16 @@ public class MagicJavaEEHttpServletResponse implements MagicHttpServletResponse
 		response.addCookie(cookie.getCookie());
 	}
 
+	@Override
+	public void setContentType(String contentType) {
+		response.setContentType(contentType);
+	}
+
+	@Override
+	public void setCharacterEncoding(String characterEncoding) {
+		response.setCharacterEncoding(characterEncoding);
+	}
+
 	@Override
 	public OutputStream getOutputStream() throws IOException {
 		return response.getOutputStream();

+ 4 - 0
magic-api/src/main/java/org/ssssssss/magicapi/core/servlet/MagicHttpServletResponse.java

@@ -14,6 +14,10 @@ public interface MagicHttpServletResponse {
 
 	public void addCookie(MagicCookie cookie);
 
+	public void setContentType(String contentType);
+
+	public void setCharacterEncoding(String characterEncoding);
+
 	public OutputStream getOutputStream() throws IOException;
 
 	public Collection<String> getHeaderNames();

+ 21 - 18
magic-api/src/main/java/org/ssssssss/magicapi/core/web/MagicWorkbenchController.java

@@ -5,8 +5,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -22,7 +20,6 @@ import org.ssssssss.magicapi.core.service.MagicAPIService;
 import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest;
 import org.ssssssss.magicapi.core.servlet.MagicHttpServletResponse;
 import org.ssssssss.magicapi.modules.db.SQLModule;
-import org.ssssssss.magicapi.modules.servlet.ResponseModule;
 import org.ssssssss.magicapi.utils.ClassScanner;
 import org.ssssssss.magicapi.utils.IoUtils;
 import org.ssssssss.magicapi.utils.SignUtils;
@@ -33,10 +30,8 @@ import org.ssssssss.script.ScriptClass;
 import org.ssssssss.script.parsing.Span;
 import org.ssssssss.script.parsing.Tokenizer;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
+import java.net.URLEncoder;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.*;
@@ -256,37 +251,45 @@ public class MagicWorkbenchController extends MagicController implements MagicEx
 	}
 
 	@RequestMapping(value = "/config-js")
-	@ResponseBody
 	@Valid(requireLogin = false)
-	public ResponseEntity<?> configJs() {
-		ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.ok().contentType(MediaType.parseMediaType("application/javascript"));
+	public void configJs(MagicHttpServletResponse response) throws IOException {
+		response.setContentType("application/javascript");
+		response.setCharacterEncoding("UTF-8");
+		byte[] bytes = "var MAGIC_EDITOR_CONFIG = {}".getBytes();
 		if (configuration.getEditorConfig() != null) {
 			try {
 				String path = configuration.getEditorConfig();
 				if (path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
 					path = path.substring(ResourceUtils.CLASSPATH_URL_PREFIX.length());
-					return responseBuilder.body(IoUtils.bytes(new ClassPathResource(path).getInputStream()));
+					bytes = IoUtils.bytes(new ClassPathResource(path).getInputStream());
 				}
 				File file = ResourceUtils.getFile(configuration.getEditorConfig());
-				return responseBuilder.body(Files.readAllBytes(Paths.get(file.toURI())));
+				bytes = Files.readAllBytes(Paths.get(file.toURI()));
 			} catch (IOException e) {
 				logger.warn("读取编辑器配置文件{}失败", configuration.getEditorConfig());
 			}
 		}
-		return responseBuilder.body("var MAGIC_EDITOR_CONFIG = {}".getBytes());
+		try (OutputStream stream = response.getOutputStream()) {
+			stream.write(bytes);
+			stream.flush();
+		}
 	}
 
 	@RequestMapping("/download")
 	@Valid(authorization = Authorization.DOWNLOAD)
-	@ResponseBody
-	public ResponseEntity<?> download(String groupId, @RequestBody(required = false) List<SelectedResource> resources, MagicHttpServletRequest request) throws IOException {
+	public void download(String groupId, @RequestBody(required = false) List<SelectedResource> resources, MagicHttpServletRequest request, MagicHttpServletResponse response) throws IOException {
 		isTrue(allowVisit(request, Authorization.DOWNLOAD), PERMISSION_INVALID);
+		response.setContentType("application/octet-stream");
 		ByteArrayOutputStream os = new ByteArrayOutputStream();
 		magicAPIService.download(groupId, resources, os);
+		String filename = "magic-api-all.zip";
 		if (StringUtils.isBlank(groupId)) {
-			return ResponseModule.download(os.toByteArray(), "magic-api-group.zip");
-		} else {
-			return ResponseModule.download(os.toByteArray(), "magic-api-all.zip");
+			filename = "magic-api-group.zip";
+		}
+		response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
+		try (OutputStream stream = response.getOutputStream()) {
+			stream.write(os.toByteArray());
+			stream.flush();
 		}
 	}