diff --git a/src/main/java/externalsystem/cleanparking/web/CpController.java b/src/main/java/externalsystem/cleanparking/web/CpController.java index de84c4ec..9ac30404 100644 --- a/src/main/java/externalsystem/cleanparking/web/CpController.java +++ b/src/main/java/externalsystem/cleanparking/web/CpController.java @@ -1,5 +1,9 @@ package externalsystem.cleanparking.web; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -18,6 +22,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import cokr.xit.DateUtil; @@ -91,6 +96,65 @@ public class CpController extends AbstractController { return returnStr; } + + @RequestMapping(name="응용프로그램업로드화면", value="/uploadApplMain.do") + public ModelAndView uploadApplMain() { + ModelAndView mav = new ModelAndView(); + + mav.setViewName("cp/uploadAppl-main"); + mav.addObject("pageName", "uploadApplMain"); + return mav; + } + + @RequestMapping(name="응용프로그램업로드", value="/uploadAppl.do") + public ModelAndView uploadAppl(HttpServletRequest hreq, MultipartFile mfile) { + ModelAndView mav = new ModelAndView("jsonView"); + + if(!mfile.getOriginalFilename().equals("CleanParking.exe")) { + return new ModelAndView("jsonView") + .addObject("saved", false); + } + + + String server = hreq.getParameter("server"); + String callHost = ""; + if(server.equals("1")) { + callHost = "http://localhost:18080/is/rentcar/intf/appl/uploadProgram.do"; + } else if(server.equals("2")) { + callHost = "http://211.119.124.9:9075/is/rentcar/intf/appl/uploadProgram.do"; + } else if(server.equals("3")) { + callHost = "https://jeju.go.kr/is/rentcar/intf/appl/uploadProgram.do"; + } + + + String folderPath = "files/temp"; + String tempSavePath = folderPath+"/CleanParking.exe"; + + File folder = new File(folderPath); + if(!folder.exists()) { + folder.mkdirs(); + } + File file = new File(tempSavePath); + + try { + Files.copy(mfile.getInputStream(), file.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } + + MultipartTest mt = new MultipartTest(); + + try { + mt.multipartPost(tempSavePath, callHost); + } catch (IOException e) { + e.printStackTrace(); + } + + mav.addObject("saved",true); + + return mav; + } + //단속자료생성메인 @RequestMapping(name="단속 자료 생성 화면", value="/createCrdnMain.do") public ModelAndView createCrdnMain() { diff --git a/src/main/java/externalsystem/cleanparking/web/MultipartTest.java b/src/main/java/externalsystem/cleanparking/web/MultipartTest.java new file mode 100644 index 00000000..d3320157 --- /dev/null +++ b/src/main/java/externalsystem/cleanparking/web/MultipartTest.java @@ -0,0 +1,114 @@ +package externalsystem.cleanparking.web; + +import java.io.IOException; +import java.math.BigInteger; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +public class MultipartTest { + + HttpClient httpClient; + + HttpRequest httpRequest; + HttpResponse httpResponse; + + protected final Map map = new HashMap<>(); + private static final String LINEFEED = "\r\n"; + private static final String DOUBLE_HYPHEN = "--"; + private static final String QUTATE = "\""; + + + + + public void multipartPost(String sendFilePath, String sendUri) throws IOException { + Path path = Path.of(sendFilePath); + BigInteger randomNumber = new BigInteger(256, new Random()); + StringBuilder boundary = new StringBuilder().append(randomNumber); + + + map.put("mfile", path); + + httpClient = HttpClient.newHttpClient(); + multipartToByte(map, boundary.toString()); + httpRequest = HttpRequest.newBuilder() + .uri(URI.create(sendUri)) + .setHeader("Accept-Language", "ko") + .setHeader("Content-Type", "multipart/form-data; boundary=" + boundary) + .POST(multipartToByte(map, boundary.toString())) + .build(); + + try { + HttpResponse response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private HttpRequest.BodyPublisher multipartToByte (Map map, String boundary) throws IOException { + List byteArrays = new ArrayList<>(); + StringBuilder stringBuilder = new StringBuilder(); + + for (Map.Entry data : map.entrySet()) { + stringBuilder.setLength(0); + stringBuilder.append(DOUBLE_HYPHEN) + .append(boundary) + .append(LINEFEED); + + if (data.getValue() instanceof Path) { + Path filePath = (Path)data.getValue(); + String mimeType = Files.probeContentType(filePath); + byte[] fileByte = Files.readAllBytes(filePath); + + stringBuilder.append("Content-Disposition: form-data; name=") + .append(QUTATE) + .append(data.getKey()) + .append(QUTATE) + .append("; filename= ") + .append(QUTATE) + .append(data.getValue()) + .append(QUTATE) + .append(LINEFEED) + .append("Content-Type: ") + .append(mimeType) + .append(LINEFEED) + .append(LINEFEED); + + byteArrays.add(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(fileByte); + byteArrays.add(LINEFEED.getBytes(StandardCharsets.UTF_8)); + } else { + stringBuilder.append("Content-Disposition: form-data; name=") + .append(QUTATE) + .append(data.getKey()) + .append(QUTATE) + .append(";") + .append(LINEFEED) + .append(LINEFEED) + .append(data.getValue()) + .append(LINEFEED); + byteArrays.add(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); + } + } + + stringBuilder.setLength(0); + stringBuilder.append(DOUBLE_HYPHEN) + .append(boundary) + .append(DOUBLE_HYPHEN); + byteArrays.add(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } + + +} diff --git a/src/main/webapp/WEB-INF/jsp/cp/uploadAppl-main.jsp b/src/main/webapp/WEB-INF/jsp/cp/uploadAppl-main.jsp new file mode 100644 index 00000000..ade22c0f --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/cp/uploadAppl-main.jsp @@ -0,0 +1,71 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%> +<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%> +
+
+ +
+

업로드

+
+
+ + +
+
+ + + + +
+ +
+
+ \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/index.jsp b/src/main/webapp/WEB-INF/jsp/index.jsp index 23c93a3b..5588d1a9 100644 --- a/src/main/webapp/WEB-INF/jsp/index.jsp +++ b/src/main/webapp/WEB-INF/jsp/index.jsp @@ -32,6 +32,7 @@
클린파킹
+
@@ -216,6 +217,28 @@ $("#btnPopEstablishJuso").on("click", function(){ }); +$("#btnUploadApplPop").on("click", function(){ + + $.ajax({ + type : "GET", + ContentType : "text/html;charset=UTF-8", + url : "/cleanparking/uploadApplMain.do", + data: {}, + success: (resp) => { + dialog.open({ + id: "cpUploadApplDialog", + title: "응용프로그램업로드", + content: resp , + size: "md", + init:() => {} + }); + }, + error : function(xhr, status, error) { + }, + complete : function(xhr, status) { + } + }); +}); $("#btnCreateCrdnPop").on("click", function(){ $.ajax({