【Java】多图片多参数上传保存接口(调用第三方保存接口,将参数传过去)

A项目接口

多参数接收对象

import lombok.Data;

/**
 * 文件数据VO对象
 *
 * @author xiaoming
 * @date 2023/11/15 13:40
 */
@Data
public class FileDataVO {
	
	private String field1;

	private String field2;

	...
}

保存接口

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.xxx.common.utils.R;
import com.xxx.common.utils.TokenUtils;
import com.xxx.vo.FileDataVO
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 图片相关接口
 *
 * @author xiaoming
 * @date 2023/11/15 13:40
 */
@RestController
@RequestMapping("/file")
public class FileController {

    @Value("${remote.app-server.url}")
    private String url;
	
	@PostMapping("/saveImgAndData")
	public R saveImgAndData(MultipartHttpServletRequest request, @RequestParam String params) throws IOException {
		// 如果在A项目里面不用做处理,应该可以不用转,直接当参数调用B项目接口就行
		FileDataVO vo = JSON.parseObject(params, FileDataVO.class);
		// 获取token根据自己项目情况来
		String token = TokenUtils.getByUsername(url + "/remote/login", vo.getUsername());

		MultiValueMap<String, MultipartFile> multiFileMap = request.getMultiFileMap();
		List<MultipartFile> files = multiFileMap.get("files");
		
		MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
		if (CollUtil.isNotEmpty(files)) {
			List<Object> fileList = new ArrayList<>();
			for (MultipartFile file : files) {
				ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()) {
					@Override
					public String getFilename() throws IllegalStateException {
						return file.getOriginalFilename();
					}
				};
				fileList.add(byteArrayResource);
			}
			map.put("files", fileList);
		}
		map.add("data", vo);

		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.MULTIPART_FORM_DATA);
		headers.add("token", token);
		
		HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(map, headers);
		// 调用别的项目接口按自己的需求来就行
		Long result = restTemplate.postForObject(url + "/file/saveImgAndData", httpEntity, Long.class);
		return R.ok().put("id", result);
	}
}

B项目接口

多参数接收对象

import lombok.Data;

/**
 * 文件数据VO对象
 *
 * @author xiaoming
 * @date 2023/11/15 14:33
 */
@Data
public class FileDataVO {
	
	private String field1;

	private String field2;

	...
}

上传图片到本地工具类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * 图片操作工具类
 *
 * @author xiaoming
 * @date 2023/11/15 14:34
 */
public class FileUploadUtils {

	private static final Logger logger = LoggerFactory.getLogger(FileUploadUtils.class);

	public static String uploadFileToLocal(MultipartFile file, Long id, String filePath, String uploadName) {
        logger.info("====>Enter the B method uploadFileToLocal");
        String relative = null;
        try {
            String folderPath = filePath + File.separator + id + File.separator;
            logger.info("====>folderPath:" + folderPath);
            File folder = new File(folderPath);
            if (!folder.exists()) {
                logger.info("====>folder.mkdirs()");
                folder.mkdirs();
            }
            relative = File.separator + id + File.separator + uploadName;
            String path = filePath + relative;
            File targetFile = new File(path);
            file.transferTo(targetFile);
            logger.info("====>Exit the B method uploadFileToLocal");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return relative;
    }
}

A项目接口调用B项目接口

import com.gexin.fastjson.JSON;
import com.xxx.vo.FileDataVO
import com.xxx.utils.FileUploadUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 图片相关接口
 *
 * @author xiaoming
 * @date 2023/11/15 14:36
 */
@RestController
@RequestMapping("/file")
public class FileController {

    @Value("${file.savePath}")
    private String savePath;
	
	@PostMapping("/saveImgAndData")
	public Long saveImgAndData(@RequestParam(required = false) MultipartFile[] files, @RequestParam("data") String data) {
		// 根据自己需求去处理即可,这里给个例子
		// 转成对应需要保存的实体
		FileDataVO vo = JSON.parseObject(data, FileDataVO.class);
		// 执行保存操作,获取到保存数据的ID数据
		Long id = saveData.getId();
		// 然后将图片进行保存操作
		if (files != null && files.length >= 1) {
			for (MultipartFile file : files) {
				String fileName = file.getOriginalFilename();
				// 将图片保存到指定路径里面(相当于是根据ID、保存路径、文件名去拼接成一个唯一的路径,保存图片之后返回路径)
				String filePath = FileUploadUtils.uploadFileToLocal(file, id, savePath, fileName);
				// 然后将图片路径数据保存到对应表中
			}
		}
		return id;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值