restapi接口开发:接收上传文件(即下载文件)并上传至ftp服务器

2023-10-27

之前接口开发一直是用的webservice方式,这次要采用restapi方式,特此记录下:

1.spring配置
2.在拦截器中配置白名单(作用:免登录调用后台服务)
在这里插入图片描述
3.接收上传文件(下载文件)后台开发

@RequestMapping(value="/apis/v1/cname/{cname}/name/{name}/version/{version}/file/{file}", method = RequestMethod.POST)
	    public String testPost(@PathVariable(value = "file")MultipartFile file,@PathVariable(value = "name") String name,
	                           @PathVariable(value = "version") String version,@PathVariable(value = "cname") String cname) {
			logger.info("name is " + name);
			logger.info("cname is " + cname);
			logger.info("version is " + version);
			logger.info("fileName is " + file.getOriginalFilename());
			
			if("".equals(name)|name==null){
				return "Name cannot be null";
			}
			if("".equals(version)|version==null){
				return "Version cannot be null";
			}
			if("".equals(file)|file==null){
				return "File cannot be null";
			}
			
			CmRes cmRes = new CmRes();
	        String resId = IdGen.uuid();
	        String userId = "wangy";
	        Date now = new Date();
	        cmResController.uploadResPakgFile("resPakgFile", resId, file);

	        logger.info("文件上传完成 ");
	        // 中间表插入数据
	        CmResMiddle cmResMiddle = new CmResMiddle();
	        cmRes.setId(resId);
			cmResMiddle.setId(IdGen.uuid());
			cmResMiddle.setMiddleId(IdGen.uuid());
			cmResMiddle.setResId(resId);
			cmResMiddle.setCreatedBy(userId);
			cmResMiddle.setCreatedTimestamp(now);
			cmResMiddleService.insertResMiddle(cmResMiddle);
			logger.info("中间表插入完成");
			cmRes.setDelFlag("0");
	        cmRes.setName(cname);
	        cmRes.setEname(name);
	        cmRes.setSoftnum(name+resId.substring(0, 3));
	        cmRes.setSoftversion(version);
	        cmRes.setTypesId("1e86891492bc4f668fa0fd442e18d51a");
	        cmRes.setClassesFirstId("04069cc295184ce899fe7f0d799ee2f9");
	        cmRes.setClassesSecondId("32776aa1f90e47ff98e0d1cf29599a32");
	        cmRes.setHot(0);
	        cmRes.setByCount(0);
	        cmRes.setBillingMode("1");
	        BigDecimal bg= new BigDecimal("0");
	        cmRes.setPrice(bg);
	        cmRes.setDepMode("1");
	        cmRes.setInstallMode("3");
	        cmRes.setSecCertify("1");
	        cmRes.setApplyOs("3");
	        cmRes.setChargeMode("1");
	        cmRes.setContent("<p>BC-PaaS镜像制品</p>");
	        cmRes.setPicUrl("/resLogoPic/db4b053fe6bf4cddb46d6e84217507a5.jpg");
	        cmRes.setDownload(0);
	        cmRes.setPubStatus("0");//下架
			cmRes.setCheckStatus("3");//待审批,前端传过来,新增的资源状态为“3未提审”
			cmRes.setResStatus("0");//新增
			
			cmRes.setCreatedBy(userId);
			cmRes.setCreatedTimestamp(now);
			cmRes.setUpdatedBy(userId);
			cmRes.setUpdatedTimestamp(now);
			cmRes.setFromWs("1");
			//插入厂商信息
			CmVendorInfo vendorInfo = new CmVendorInfo();
			String vendorId = UUID.randomUUID().toString();
			cmRes.setVendorId(vendorId);
			vendorInfo.setSupName("BC-PaaS");
			vendorInfo.setCreateBy("wangy");
			vendorInfo.setCreateDate(now);
			vendorInfo.setId(vendorId);
			cmVendorInfoMapper.insertSelective(vendorInfo);
			cmResMapper.insertSelective(cmRes);
			//插入标签信息
			String labelId="f7f719b1b11d41c7845fc88d6694276a";
			CmResLabels cmResLabels = new CmResLabels();
			cmResLabels.setId(IdGen.uuid());
			cmResLabels.setResId(resId);
			cmResLabels.setLabelId(labelId);
			cmResLabelsMapper.insertSelective(cmResLabels);
			logger.info("Docker文件上传完成 ");
			return "success";
	    }
		
	
	private final static String[] hex = {
		        "00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F",
		        "10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F",
		        "20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F",
		        "30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F",
		        "40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F",
		        "50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F",
		        "60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F",
		        "70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F",
		        "80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F",
		        "90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F",
		        "A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF",
		        "B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF",
		        "C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF",
		        "D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF",
		        "E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF",
		        "F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"
		    };
		
		private final static byte[] val = {
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
		        0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
		    };
		
		public static String escape(String s) {
	        StringBuffer sbuf = new StringBuffer();
	        int len = s.length();
	        for (int i = 0; i < len; i++) {
	            int ch = s.charAt(i);
	            if (ch == ' ') {                        // space : map to '+' 
	                sbuf.append('+');
	            } else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it was
	                sbuf.append((char)ch);
	            } else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it was
	                sbuf.append((char)ch);
	            } else if ('0' <= ch && ch <= '9') {    // '0'..'9' : as it was
	                sbuf.append((char)ch);
	            } else if (ch == '-' || ch == '_'       // unreserved : as it was
	                || ch == '.' || ch == '!'
	                || ch == '~' || ch == '*'
	                || ch == '/' || ch == '('
	                || ch == ')') {
	                sbuf.append((char)ch);
	            } else if (ch <= 0x007F) {              // other ASCII : map to %XX
	                sbuf.append('%');
	                sbuf.append(hex[ch]);
	            } else {                                // unicode : map to %uXXXX
	                sbuf.append('%');
	                sbuf.append('u');
	                sbuf.append(hex[(ch >>> 8)]);
	                sbuf.append(hex[(0x00FF & ch)]);
	            }
	        }
	        return sbuf.toString();
	    }
		
		public static String unescape(String s) {
	        StringBuffer sbuf = new StringBuffer();
	        int i = 0;
	        int len = s.length();
	        while (i < len) {
	            int ch = s.charAt(i);
	            if (ch == '+') {                        // + : map to ' ' 
	                sbuf.append(' ');
	            } else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it was
	                sbuf.append((char)ch);
	            } else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it was
	                sbuf.append((char)ch);
	            } else if ('0' <= ch && ch <= '9') {    // '0'..'9' : as it was
	                sbuf.append((char)ch);
	            } else if (ch == '-' || ch == '_'       // unreserved : as it was
	                || ch == '.' || ch == '!'
	                || ch == '~' || ch == '*'
	                || ch == '/' || ch == '('
	                || ch == ')') {
	                sbuf.append((char)ch);
	            } else if (ch == '%') {
	                int cint = 0;
	                if ('u' != s.charAt(i+1)) {         // %XX : map to ascii(XX)
	                    cint = (cint << 4) | val[s.charAt(i+1)];
	                    cint = (cint << 4) | val[s.charAt(i+2)];
	                    i+=2;
	                } else {                            // %uXXXX : map to unicode(XXXX)
	                    cint = (cint << 4) | val[s.charAt(i+2)];
	                    cint = (cint << 4) | val[s.charAt(i+3)];
	                    cint = (cint << 4) | val[s.charAt(i+4)];
	                    cint = (cint << 4) | val[s.charAt(i+5)];
	                    i+=5;
	                }
	                sbuf.append((char)cint);
	            }
	            i++;
	        }
	        return sbuf.toString();
	    }
/**
	 * 上传软件包
	 * 
	 * @param remotePath
	 * @param resId
	 * @param multipartFile
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/uploadResPakgFile")
	public Map<String, Object> uploadResPakgFile(
			@RequestParam String remotePath, @RequestParam("id") String resId,
			@RequestParam("resPakgFileName") MultipartFile multipartFile) {
		Map<String, Object> response = new HashMap<String, Object>();
		try {
			String newFileName = "";
			if (!multipartFile.isEmpty()) {
				// 原始文件名
				// String originalFilename =
				// multipartFile.getOriginalFilename();
				// String fileFormat_ =
				// originalFilename.substring(originalFilename.lastIndexOf(".")
				// + 1);

				String originalFilename = multipartFile.getOriginalFilename();
				String fileFormat_ = "";
				if (originalFilename.contains(".")) {
					fileFormat_ = originalFilename.substring(originalFilename
							.lastIndexOf(".") + 1);
					newFileName = IdGen.uuid() + "." + fileFormat_;// 随机字符串加原始后缀
				} else {
					newFileName = IdGen.uuid();// 随机字符串加原始后缀
				}

				String resUploadPath = Global.getConfig("ResUploadPath");// F:\neunn_app_store_cmcc\resupload
				String localFileDir = resUploadPath + File.separator + remotePath;
				String localFilePath = localFileDir + File.separator + newFileName;
				checkOrCreateDirPath(new File(localFileDir));
				OutputStream outputStream = new FileOutputStream(new File(localFilePath));
				boolean success = saveFile(multipartFile.getInputStream(), outputStream);
				if (success) {
					/*获取病毒扫描结果*/
					boolean scanResult = "true".equalsIgnoreCase(Global.getConfig("clamav.skipScan")) ?
							true : this.fileVirusScan(localFilePath);
					if(scanResult){
						String date = DateUtils.getDate();
						String dir = "resPakgFile/"+date;
						InputStream inputStream = multipartFile.getInputStream();
						// 上传到Ftp
						Map<String, Object> dataMap = this.doFtpUpload(dir, newFileName, inputStream);
						boolean bol = (Boolean) dataMap.get("bol");
						if(bol){
							//上传成功,将异步地将文件传到
							FtpConf conf = confService.getFtpConf();
							if("master".equals(conf.getCurrNode())){
								//如果当前使用的是master,
								if(!"0".equals(conf.getExt2())){
									//并且slave可用,则异步上传到slave
									FTPServerUtil.copyFtpFileAsyn("masterFtpConfig.properties", "slaveFtpConfig.properties", dir, newFileName);
								}
							}else{
								//如果当前使用的是slave,
								if(!"0".equals(conf.getExt1())){
									//并且master可用,则异步上传到master
									FTPServerUtil.copyFtpFileAsyn("slaveFtpConfig.properties", "masterFtpConfig.properties", dir, newFileName);
								}
							}
							// 上传文件成功,将其存入数据库
							CmRespakg cmRespakg = new CmRespakg();
							cmRespakg.setId(IdGen.uuid());
							cmRespakg.setResId(resId);
							cmRespakg.setName(originalFilename);
							cmRespakg.setSize(multipartFile.getSize());// B
							cmRespakg.setPath(dir + "/" + newFileName);
							Date now = new Date();
							CmSysUsers user = CmUserUtils.getCmUser();
							String userId = user.getUserId();
							cmRespakg.setCreatedBy(userId);
							cmRespakg.setCreatedTimestamp(now);
							cmRespakg.setUpdatedBy(userId);
							cmRespakg.setUpdatedTimestamp(now);
							// 一个资源对应一个资源包
							// int effectRow =
							// cmRespakgService.insertSelectiveWithDel(cmRespakg);
							int effectRow = cmRespakgService.insertSelective(cmRespakg);
							if (effectRow > 0) {
								response.put("success", "true");
								response.put("fileName", originalFilename);
								response.put("cmRespakgId", cmRespakg.getId());
								response.put("msg", "上传成功");
							} else {
								response.put("success", "false");
								response.put("msg", "上传成功,数据保存失败");
							}
							// 删除本地文件
							File file = new File(localFilePath);
							file.delete();
						}else {
							response.put("success", "false");
							response.put("msg", String.valueOf(dataMap.get("msg")));
						}
					}else{// 删除病毒文件
						File file = new File(localFilePath);
						file.delete();
						response.put("success", "false");
						response.put("msg", "文件含有病毒,已经删除!");
					}
					
				} else {
					response.put("success", "false");
					response.put("msg", "上传失败");
				}
			}else{
				response.put("success", "false");
				response.put("msg", "文件为空");
			}
		} catch (Exception e) {
			response.put("success", "false");
			response.put("msg", e.getMessage());
		}
		return response;
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

restapi接口开发:接收上传文件(即下载文件)并上传至ftp服务器 的相关文章

随机推荐

  • BUG已解决:ModuleNotFoundError: No module named ‘torchtext.legacy‘

    from torchtext legacy data import Field BucketIterator from torchtext legacy datasets translation import Multi30k 当执行上诉语
  • cublas cudnn优化笔记

    文章目录 前言 cublas 常用API 数据格式 cublasGemmEx cublasLtMatmul cuDNN 常用API cudnnConvolutionForward 前言 cublas 官方指南 https docs nvid
  • 获取一个字符串中指定子串出现的次数

    方法一 indexof str i 在调用的字符串中 从i开始查询 str出现的索引位置 没有返回 1 有返回索引位置 String string hanbasdnbafllgnbahjnbakqqqqlnbaxi String str n
  • NLP系列 5. 朴素贝叶斯、SVM、LDA主题模型

    朴素贝叶斯 贝叶斯公式 概率统计中学过了贝叶斯定理的数学表示 P A B P
  • ubuntu下最简单的方式安装Qt及QtCreator

    命令行安装 sudo apt get install qt5 default qtcreator
  • 什么格式的wav文件最小?

    经测试 用Adobe Audition 3 0保存为wav文件时 用 微软 ADPCM wav 保存的文件最小 很适合网面用音频文件的处理 噢 我这里只是用来做提示用户的提示音 如果你有其它用途要保持音质则另当别论
  • A Practical Guide to Quantitative Finance Interviews

    Brain Teasers 问题 海盗分金问题 大于等于一半算作通过版本 老虎和羊问题 100只老虎一只羊 只能一只老虎吃一只羊 吃完羊就变成老虎了 问羊会不会被吃 过河问题 4个人过河 只有一个手电 过河必须用手电 最多两个人同时过河 速
  • 几个问题的总结

    1 PHYSX如何设置模型的质心 2 履带转圈问题 还需要几何运算么 3 为何关闭后 有时会中断到 material这个部分 4 如何将shadowmap和hdr相互结合 这几天需要干的事情 1 volume light 2 pccs 3
  • Unity 物理引擎之铰链关节(Hinge Joint)

    关节分类 铰链关节 Hinge Joint 下面举个例子 创建一个小球 选中小球添加铰链关节如下所示 此时运行 因为这条箭头朝向X轴 所以会围绕X轴转动 介绍Sphere上的Hinge Joint 的属性以及应用 新建的Cube的设置 添加
  • 完整兼职项目——2500块接的外包Python项目

    这次给大家带来的是一个2500的爬虫外包项目 在这里肯定有人说这个不值这么多 也有人会各种嘲讽 但是别忘了 人的眼界不一样 做事的决定自然会不同 如果2500能给你带来25000的利润 那么你会选择毫不犹豫的支付吗 话不多说 看聊天记录 还
  • Wonder Workshop:全球教育机器人产业格局初变

    转自 http www techweb com cn news 2016 02 23 2282671 shtml 导语 目前 全球教育机器人细分市场中 一批新兴的企业正在冲击着乐高 一家独大 的市场地位 整个市场也开始呈现出两大市场分支 一
  • 管理就是最大程度发挥别人的善意

    管理就是最大程度发挥别人的善意 前置条件 人人生来平等 人是自由的 人的潜力是无法衡量的 步骤 新员工从入职 招聘创意精英 为员工设立期望值 需要跟新员工沟通想在公司里工作多久 想在期间内达到什么成就 给员工讨论想达到预期成就需要哪些能力
  • 【多模态】13、Vision-Language 模型在视觉任务中的调研

    文章目录 一 简介 二 基础知识 2 1 视觉任务的训练策略 2 2 VLM 基础 2 2 1 网络结构 2 2 2 预训练目标函数 2 2 3 评估和下游任务 2 3 数据集 三 迁移学习 3 1 使用 prompt tuning 实现迁
  • 从零开发区块链应用(八)--结构体初识

    文章目录 一 结构体定义 二 初始化结构体 三 结构体的访问 四 结构体指针 五 结构体可见性 六 结构体标签 七 结构体嵌套 八 结构体方法 九 结构体特性 Go语言中提供了对struct的支持 struct 中文翻译称为结构体 与数组一
  • js运算符之一元运算符

    一元运算符 var a 2 a 它就等价于a a 1 先返回结果后运算 上面的语句块就可以写成下面的语句块 它们是等价的 var a 2 a a 1 同理 a 就相当于 a a 1 也是先运算后返回结果 注意 无论是 a a 还是 a a
  • golang 中http请求时 header头字段首字母自动大写问题

    当使用http请求 设置header头 使用的方法 req Header Set k v 发现请求过程中 k的首字母自动变为了大写 查看下发现使用了 CanonicalMIMEHeaderKey 这个函数 自动将首字母转化了 Canonic
  • 看懂UML类图和时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到 我只想讲讲类图中各个类之间的关系 能看懂类图中各个类之间的线条 箭头代表什么意思后 也就足够应对 日常的工作和交流 同时 我们应该能将类图所表达的含义和最终的代码对应起来 有了这些知
  • 基于stm32cubemx和keil的stm32(以stm32F407ZGTx为例)单片机的开发----实现printf函数将信息打印至串口

    一 printf打印函数实验 二 实验步骤 1 在cube里设置引脚 串口 串口5设置成异步 2 生成代码打开工程 别忘了先调试JLink 在main c文件开头添加头文件 在主函数外的用户区书写读取文件流函数 这样就可以使用printf函
  • 配置整洁的python环境(一)——jupyter notebook与虚拟环境

    创建虚拟环境 创建一个python版本为3 7的python环境 conda create name xxx python 3 7 jupyter notebook Jupyter Notebook是基于网页的用于交互计算的应用程序 其可被
  • restapi接口开发:接收上传文件(即下载文件)并上传至ftp服务器

    之前接口开发一直是用的webservice方式 这次要采用restapi方式 特此记录下 1 spring配置 2 在拦截器中配置白名单 作用 免登录调用后台服务 3 接收上传文件 下载文件 后台开发 RequestMapping valu