JAVA 实现远程文件下载

    相信很多同学在实际的项目开发中都会遇到一个问题,如何跨服务下载文件?在传统SSH,SSH2,SSM架构中可能很少遇到这样的问题,但是在当前逐渐流行的微服务架构中,这是一个很常见的问题。

    举个例子,比如你有A服务是文件管理服务,B服务是文件调用服务。现在我要通过B服务访问A服务上的文件,如何实现呢?有过微服务经验的同学应该会想到使用接口调用。确实在我们这篇文章中是采用http协议,走接口调用。但是,很多同学就有点懵了,我只见过服务间接口调用通过json,xml格式传数据啊,没有见过传输文件流的。

    别着急!本文带你实现。

    废话这么久了请看下文代码:

    提示:由于本文是基于微服务架构,所以使用的技术全部来源于spring框架。

    首先我们实现A服务的文件下载接口,请看下代码:

	@RequestMapping(value = "/download/{fileId}", method = RequestMethod.GET)
	public ResponseEntity<byte[]> fileDocDownload(@PathVariable String fileId) {
		//从本地获取文件流,转换成字节流输出
		try {
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();//创建一个字节输出流
			FileInputStream fin = new FileInputStream("d:/test/" + fileId + ".txt");//根据fileId获取文件输入流
			byte[] read = new byte[1024];
			int len = 0;
			while ((len = fin.read(read)) != -1) {
				outStream.write(read, 0, len);
				outStream.flush();
			}
			fin.close();
			HttpHeaders headers = new HttpHeaders();
			headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//设置返回头媒体类型为流
            headers.setContentDispositionFormData("attachment",	new String((fileId+".txt").getBytes("UTF-8"), "ISO8859-1"));
			return new ResponseEntity<byte[]>(outStream.toByteArray(), headers, HttpStatus.OK);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

    好了我们已经实现了A服务的文件提供接口,那么B服务如何通过http协议下载呢?

    现在我们来实现B服务的文件下载方法,请看下以下代码:

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.CloseableHttpResponse;

/**
	 * 下载文件,返回输入流。
	 * 
	 * @param apiUrl api接口
	 * @return (文件)输入流
	 * @throws Exception
	 */
	public static InputStream getStreamDownloadOutFile(String apiUrl) throws Exception {
		InputStream is = null;
		CloseableHttpClient httpClient = HttpClients.createDefault();//创建默认http客户端
		RequestConfig requestConfig= RequestConfig.DEFAULT;//采用默认请求配置
		HttpGet request = new HttpGet(apiUrl);//通过get方法下载文件流
		request.setConfig(requestConfig);//设置请头求配置
		try {
			CloseableHttpResponse httpResponse = httpClient.execute(request);//执行请求,接收返回信息
			int statusCode = httpResponse.getStatusLine().getStatusCode();//获取执行状态
			if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) {
				request.abort();
			} else {
				HttpEntity entity = httpResponse.getEntity();
				if (null != entity) {
					is = entity.getContent();//获取返回内容
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			request.abort();
		}
		return is;
	}

至此,B服务的远程下载文件流的方法已经封装完成,是不是感觉非常简单呢?

    B服务获取到文件流后就可以去实现自己的业务啦,在我们的实际项目中通常都会专门构建一个文件服务器,所以服务间文件的传输方法是Java程序员必须掌握的技术内容,特别是在当前微服务化逐步盛行的时代。

    你学会了吗?快动手试试吧!

猜你喜欢

转载自blog.csdn.net/u014267900/article/details/80712357
今日推荐