java实现远程文件下载

转自JAVA 实现远程文件下载

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

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

首先我们实现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程序员必须掌握的技术内容,特别是在当前微服务化逐步盛行的时代。

发布了67 篇原创文章 · 获赞 70 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/fukaiit/article/details/89196908
今日推荐