RestTemplate上传、下载文件实例代码

 更新时间:2025年02月10日 08:54:48   作者:淋雨一直走啊  
介绍了文件上传和下载的基本方法,包括处理本地文件和文件流,上传时区分了文件是否在本地,下载时强调返回值为byte[],并提供了工具类进行进一步处理

上传

上传文件分两种

  • ①要处理的文件本身存在当前文件系统下
  • ②要处理的文件只是个临时文件,或者说是文件流的形式存在

在以下代码中会分别标注

private static void upAttach() {
    String uploadUrl = "http://192.168.1.10/upload";
    String appId = "";
    String accessKey = "";
    String filePath = "";
    String originalFilename = "test.xlsx";
    
    long currentTimeMillis = System.currentTimeMillis();
    String timeMillis = String.valueOf(currentTimeMillis);
    // 文件路径
    String base64key = Base64.encodeBase64String(filePath.getBytes());
    String sign = getSign(appId, base64key, timeMillis, accessKey);

    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(3);
    
    // @Deprecated 
    // Write to temporary file and then process, need to be deleted and tends to generate too much garbage
    // Path tempFile = Files.createTempFile("upload-file", ".txt");
    // Files.write(tempFile, file.getBytes());
    // params.add("file", new FileSystemResource(tempFile.toFile()));

	// ============================== 这里是重点 ==============================
    // ① 文件存在,直接获取文件输入流即可
	File file = new File("c:\\test.xlsx");
    params.add("file", new InputStreamResource(file.getInputStream(), originalFilename));

	// ② 临时文件,如MultipartFile,获取其字节流来处理
	MultipartFile multipartFile = null;
	byte[] byteArray = multipartFile.getBytes();
    ByteArrayResource byteArrayResource = new ByteArrayResource(byteArray) {
        @Override
        public String getFilename() {
        	// 这里不指定文件名的话,上传过去的文件名会乱码
            return originalFilename;
        }
    };
    params.add("file", byteArrayResource);
	// ========================================================================

	// 其他参数按需采用	
    // key为文件路径
    params.add("key", filePath);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    headers.add("x-fs-timestamp", timeMillis);
    headers.add("x-fs-appid", appId);
    headers.add("x-fs-sign", sign);
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);

    RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);
    restTemplate.postForObject(uploadUrl, requestEntity, JSONObject.class);
}


/** 加密 **/
private static String getSign(String appId, String base64key, String timestamp, String accessKey) {
    String sign = appId + "|" + base64key + "|" + timestamp;
    return new HmacUtils(HmacAlgorithms.HMAC_SHA_256, accessKey).hmacHex(sign);
}

下载

下载只需要注意返回值为byte[]即可:

// resource为文件唯一标识,按需采用
public static final byte[] dwAttach(String resource) {
    String appId = "";
    String accessKey = "";

    long currentTimeMillis = System.currentTimeMillis();
    String timeMillis = String.valueOf(currentTimeMillis);
    String base64key = Base64.encodeBase64String(resource.getBytes());
    String sign = getSign(appId, base64key, timeMillis, accessKey);

    String downloadUrl = "http://192.168.1.10?appid={appId}&timestamp={timestamp}&sign={sign}";
    HashMap<String, Object> uriVariables = new HashMap<>(5);
    uriVariables.put("appId", appId);
    uriVariables.put("timestamp", timeMillis);
    uriVariables.put("sign", sign);
    RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);

    return restTemplate.getForObject(downloadUrl, byte[].class, uriVariables);
}

后续可通过new ByteArrayInputStream(byte[])转换成流,或者org.springframework.util.FileCopyUtils, org.apache.commons.io.FileUtils等工具类,进行其他处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot处理跨域的实现方式(附Demo)

    Springboot处理跨域的实现方式(附Demo)

    这篇文章主要介绍了Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • IntelliJ IDEA 中编写 Speak 程序的详细步骤和指南

    IntelliJ IDEA 中编写 Speak 程序的详细步骤和指南

    本文介绍了如何在IntelliJIDEA中编写一个语音交互程序,包括环境准备、编写代码、运行和测试以及调试优化,通过使用GoogleCloud的语音处理API,可以实现语音转文本和文本转语音功能,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 使用React和springboot做前后端分离项目的步骤方式

    使用React和springboot做前后端分离项目的步骤方式

    这篇文章主要介绍了使用React和springboot做前后端分离项目的步骤方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • springboot关闭druid监控 druid2改配置文件无效的解决

    springboot关闭druid监控 druid2改配置文件无效的解决

    这篇文章主要介绍了springboot关闭druid监控 druid2改配置文件无效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java中的内部类超详细讲解

    Java中的内部类超详细讲解

    内部类是定义在另一个类内部的类,可分为成员、静态、局部和匿名内部类,这篇文章主要介绍了Java中内部类的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • Java JVM调优五大技能详解

    Java JVM调优五大技能详解

    这篇文章主要为大家介绍了JVM调优的五大技能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Android图片转换器代码分享

    Android图片转换器代码分享

    本文给大家总结了下在安卓程序中进行图片转换的方法,非常的实用,小伙伴们可以参考下。
    2015-10-10
  • Spring Boot接口设计防篡改、防重放攻击详解

    Spring Boot接口设计防篡改、防重放攻击详解

    这篇文章主要给大家介绍了关于Spring Boot接口设计防篡改、防重放攻击的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • mybatisplus开启sql打印的三种方式汇总

    mybatisplus开启sql打印的三种方式汇总

    这篇文章主要介绍了mybatisplus开启sql打印的三种方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 详解SpringBoot的Run方法

    详解SpringBoot的Run方法

    本文给大家介绍了SpringBoot的Run方法,文中通过实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10

最新评论