OpenFeign文件上传下载

记录一下OpenFeign文件上传下载接口

上传

服务提供方接口

@PostMapping("upload")
public void upload(String fileOssName, @RequestBody byte[] bytes) {
	OSS ossClient = new OSSClientBuilder().build(END_POINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
	ossClient.putObject(BUCKET_NAME_PC, fileOssName, new ByteArrayInputStream(bytes));
	ossClient.shutdown();
}

服务接口直接接收byte数组,bytes参数要用@RequsetBody接收

这里最终上传到阿里云OSS,换成其他目的地流都类似。

byte数组可以转化为InputStream: new ByteArrayInputStream(bytes)

服务调用方的远程接口

@FeignClient("oss-service")
public interface OssFeignService {
	
	@PostMapping("oss/upload")
	public Result upload(@RequestParam String fileOssName, @RequestBody byte[] bytes);
	
}

服务调用方接口

ossFeignService.upload(fileOssName, bytes);

bytes来源为文件或内存,具体看自己业务

下载

服务提供方接口

@GetMapping("download")
public byte[] download(String fileOssName) throws Exception {
	OSS ossClient = new OSSClientBuilder().build(END_POINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
	OSSObject ossObject = ossClient.getObject(BUCKET_NAME_APP, fileOssName);
	InputStream in = ossObject.getObjectContent();
	
	ByteArrayOutputStream out = new ByteArrayOutputStream();
	IoUtils.copy(in, out);
	
	out.close();
	in.close();
	ossClient.shutdown();
	
	return out.toByteArray();
}

这里的InputStream来源于阿里云OSS,换成其他输入流都类似

IoUtils是OSS提供的工具类,copy方法其实就是我们平时写的二进制流的读写,源码如下

static public long copy(InputStream input, OutputStream output) throws IOException {
	byte[] buffer = new byte[1024];
	int bytesRead;
	int totalBytes = 0;
	while ((bytesRead = input.read(buffer)) != -1) {
		output.write(buffer, 0, bytesRead);

		totalBytes += bytesRead;
	}

	return totalBytes;
}

服务调用方的远程接口

@FeignClient("oss-service")
public interface OssFeignService {
	
	@GetMapping("oss/download")
	public byte[] download(@RequestParam String fileOssName);
	
}

服务调用方接口

@GetMapping("download")
public void download(String fileOssName, String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
	ExcelUtil.setResponseHeader(request, response, fileName);
	
	byte[] bytes = thirdPartyFeignService.downloadFromPc(fileOssName);
	OutputStream out = response.getOutputStream();
	
	out.write(bytes);
	out.flush();
	out.close();
}

其中setResponseHeader方法设置下载头信息

public static void setResponseHeader(HttpServletRequest request, HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
	String agent = request.getHeader("USER-AGENT");
	if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident") || null != agent && -1 != agent.indexOf("Edge")) {// ie
		fileName = java.net.URLEncoder.encode(fileName, "UTF8");
	} else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
		fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
	}

	response.setContentType("application/octet-stream; charset=utf-8");
	response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
	response.addHeader("Pargam", "no-cache");
	response.addHeader("Cache-Control", "no-cache");
}
原文地址:https://www.cnblogs.com/tenny-peng/p/13092046.html