diff options
Diffstat (limited to 'webservice/src/main/java/app/market/webservice/dataManager/AppFileController.java')
-rw-r--r-- | webservice/src/main/java/app/market/webservice/dataManager/AppFileController.java | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/webservice/src/main/java/app/market/webservice/dataManager/AppFileController.java b/webservice/src/main/java/app/market/webservice/dataManager/AppFileController.java new file mode 100644 index 0000000..8a24a58 --- /dev/null +++ b/webservice/src/main/java/app/market/webservice/dataManager/AppFileController.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2019 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package app.market.webservice.dataManager; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLDecoder; +import java.net.URLEncoder; + +import javax.imageio.ImageIO; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import app.market.LogUtil; +import app.market.common.comm; +import app.market.model.app.FileInfo; +import app.market.utils.constants.Constants; +import app.market.utils.json.JsonMapperUtils; +import app.market.utils.property.KeysConstants; +import app.market.utils.webservice.ApiParam; +import app.market.utils.webservice.ErrorCode; +import app.market.utils.webservice.ErrorCodeEnum; +import app.market.utils.webservice.WebServiceURI; +import app.market.webservice.WebserviceRestBaseController; + + +@RestController +public class AppFileController extends WebserviceRestBaseController { + + private static Logger logger = LoggerFactory.getLogger(AppFileController.class); + + @Autowired + ServletContext context; + + /** + * upload application file + * @param inputFile + * @param md5 + * @param appDeviceType + * @param appId + * @param orgFileName + * @return + */ + @RequestMapping(value = WebServiceURI.REST_APP_FILE_PARM_FILENAME_TYPEID_APPID_LF, headers = ("content-type=multipart/*"), method = RequestMethod.POST) + public String upload(@RequestParam(ApiParam.API_APP_PARAM_MULTIPARTFILE) MultipartFile inputFile + ,@RequestParam(ApiParam.API_APP_PARAM_FILE_HASH) String hashcode + ,@PathVariable(ApiParam.API_APP_PARAM_APPDEVICETYPEID) String appDeviceType + ,@PathVariable(ApiParam.API_APP_PARAM_APPID) String appId + ,@PathVariable(ApiParam.API_APP_PARAM_FILE_NAME) String orgFileName + , HttpServletResponse response) { + logger.debug("upload"); + + FileInfo fileInfo = new FileInfo(); + String responseStr = null; + + if (inputFile.isEmpty() || StringUtils.isEmpty(hashcode)) { + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.MISSING_RESOURCE,KeysConstants.MISSING_NECESSARY_QUERYPARAM)); + } + + if(!orgFileName.endsWith(Constants.FILE_TYPE)){ + return comm.getResponseError(response, Constants.STATUS_UNSUPPORT, + new ErrorCode(ErrorCodeEnum.UNSUPPORT_FILE,KeysConstants.APP_FILE_TYPE_IS_UNSUPPORTED)); + } + + //md5 check file + try { + String md5Hex = DigestUtils.md5Hex(inputFile.getInputStream()); + if (!md5Hex.equalsIgnoreCase(hashcode)) { + return comm.getResponseError(response, Constants.STATUS_BAD_FILE, + new ErrorCode(ErrorCodeEnum.MD5_FAILED,KeysConstants.APP_UPLOAD_MD5)); + } + } catch (IOException e) { + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.MISSING_RESOURCE,KeysConstants.STATUS_BAD_REQUEST)); + } + + try { + orgFileName = URLDecoder.decode(orgFileName, "utf-8"); + String destFileName = FileUtil.createFileName(orgFileName); + String destFilePath = FileUtil.getUploadPath(FileUtil.getAppPath(appDeviceType, appId)); + + //save appFile + String destPath = destFilePath + destFileName; + File destFile = new File(destFilePath + destFileName); + inputFile.transferTo(destFile); + + //uncompress appFile + String uncompressFilePath = FileUtil.uncompress(destPath); + logger.debug("uncompressFilePath=" + uncompressFilePath); + + //check uncompress file + if(StringUtils.isEmpty(uncompressFilePath)){ + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.BAD_FAILED,KeysConstants.APP_FILE_UNCOMPRESS_FAILED)); + } + + if (StringUtils.isNotEmpty(uncompressFilePath)) { + // get info in config.xml + FileUtil.parseConfigInfo(uncompressFilePath, fileInfo); + + //check customer appid + if(StringUtils.isEmpty(fileInfo.getConfigAppId()) + || StringUtils.isEmpty(fileInfo.getConfigVersionName())){ + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.BAD_FAILED,KeysConstants.APP_FILE_READ_FAILED)); + } + + // save icon image of appFile + String iconPath = ""; + if (StringUtils.isNotEmpty(fileInfo.getIconPath())) { + iconPath = FileUtil.saveAppIcon(uncompressFilePath, fileInfo.getIconPath()); + fileInfo.setIconPath(iconPath);///resource/appIcon/b4a527c0-0bfc-4ca1-99da-cdd4850ceb43_icon.svg + } + + // remove temp directory of uncompress + FileUtil.removeFile(uncompressFilePath); + } + String relativeFilePath = FileUtil.getAppPath(appDeviceType, appId) + destFileName; + fileInfo.setFileName(orgFileName); + fileInfo.setFileSize(inputFile.getSize()); + fileInfo.setFilePath(relativeFilePath); + fileInfo.setFileHashCode(hashcode); + + responseStr = JsonMapperUtils.writeValueAsString(fileInfo); + } catch (Exception e) { + responseStr = comm.getResponseException(response, e); + } + + logger.debug("upload end"); + return responseStr; + } + + /** + * download + * @param fileName + * @param appType + * @param appId + * @return + * @throws IOException + */ + @RequestMapping(value = WebServiceURI.REST_APP_FILE_PARM_FILEPATH_LF, method = RequestMethod.GET) + public ResponseEntity<byte[]> download(@RequestParam(ApiParam.API_APP_PARAM_FILE_PATH) String filePath) throws IOException { + + String downloadPath = FileUtil.getUploadPath(filePath); + String orgFileName = FileUtil.getOrgFileName(filePath); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", URLEncoder.encode(orgFileName,"UTF-8")); + + byte[] body = null; + ResponseEntity<byte[]> responseEntity = null; + + try { + File file = new File(downloadPath); + body = FileUtils.readFileToByteArray(file); + + responseEntity = new ResponseEntity<byte[]>(body, headers, HttpStatus.OK); + } catch (IOException e) { + LogUtil.printCatchLog(logger, e); + responseEntity = new ResponseEntity<byte[]>(body, headers, HttpStatus.INTERNAL_SERVER_ERROR); + e.printStackTrace(); + } + return responseEntity; + } + + /** + * upload image + * @param inputFile + * @param orgFileName + * @param response + * @return + * @throws IOException + */ + @RequestMapping(value = WebServiceURI.REST_APP_IMAGE_LF, headers = ("content-type=multipart/*"), method = RequestMethod.POST) + public String imageUpload(@RequestParam(ApiParam.API_APP_PARAM_MULTIPARTFILE) MultipartFile inputFile + ,@RequestParam(value=ApiParam.API_APP_PARAM_FILE_NAME,required = false) String orgFileName + , HttpServletResponse response){ + logger.debug("imageUpload"); + + FileInfo fileInfo = new FileInfo(); + String responseStr = null; + + //check image + if (inputFile.isEmpty()) { + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.MISSING_RESOURCE,KeysConstants.MISSING_NECESSARY_QUERYPARAM)); + } + try { + //check image + String contentType = inputFile.getContentType(); + String imageStr = contentType.substring(Constants.IMAGE_INT,contentType.lastIndexOf(Constants.PATH_SEPARATOR)); + if(!orgFileName.endsWith(Constants.IMAGE_SVG) && !orgFileName.endsWith(Constants.IMAGE_PNG) + &&!imageStr.equals(Constants.IMAGE_TYPE)) { + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.MISSING_RESOURCE,KeysConstants.UPLOAD_PICTURES_ONLY)); + } + if(inputFile.getSize() > (Constants.IMAGE_SIZE)) { + return comm.getResponseError(response, Constants.STATUS_BAD_REQUEST, + new ErrorCode(ErrorCodeEnum.MISSING_RESOURCE,KeysConstants.THE_PICTURE_SIZES)); + } + if(StringUtils.isEmpty(orgFileName)){ + orgFileName = inputFile.getOriginalFilename(); + } + String destFilePath = FileUtil.getImagePath(orgFileName); + + File destFile = new File(destFilePath); + inputFile.transferTo(destFile); + + String fullImagePath = FileUtil.getImageAccessPath(destFilePath); + fileInfo.setIconPath(fullImagePath); + + responseStr = JsonMapperUtils.writeValueAsString(fileInfo); + } catch (Exception e) { + responseStr = comm.getResponseException(response, e); + } + + logger.debug("imageUpload end"); + return responseStr; + } + +} |