id | title | sidebar_label |
---|---|---|
upload_download | 上传下载 | 上传下载 |
Forest从 1.4.0
版本开始支持多种形式的文件上传和文件下载功能
上传
/**
* 用@DataFile注解修饰要上传的参数对象
* OnProgress参数为监听上传进度的回调函数
*/
@Post(url = "/upload")
Map upload(@DataFile("file") String filePath, OnProgress onProgress);
调用上传接口以及监听上传进度的代码如下:
Map result = myClient.upload("D:\\TestUpload\\xxx.jpg", progress -> {
System.out.println("total bytes: " + progress.getTotalBytes()); // 文件大小
System.out.println("current bytes: " + progress.getCurrentBytes()); // 已上传字节数
System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 已上传百分比
if (progress.isDone()) { // 是否上传完成
System.out.println("-------- Upload Completed! --------");
}
});
在文件上传的接口定义中,除了可以使用字符串表示文件路径外,还可以用以下几种类型的对象表示要上传的文件:
/**
* File类型对象
*/
@Post(url = "/upload")
Map upload(@DataFile("file") File file, OnProgress onProgress);
/**
* byte数组
* 使用byte数组和Inputstream对象时一定要定义fileName属性
*/
@Post(url = "/upload")
Map upload(@DataFile(value = "file", fileName = "${1}") byte[] bytes, String filename);
/**
* Inputstream 对象
* 使用byte数组和Inputstream对象时一定要定义fileName属性
*/
@Post(url = "/upload")
Map upload(@DataFile(value = "file", fileName = "${1}") InputStream in, String filename);
/**
* Spring Web MVC 中的 MultipartFile 对象
*/
@PostRequest(url = "/upload")
Map upload(@DataFile(value = "file") MultipartFile multipartFile, OnProgress onProgress);
/**
* Spring 的 Resource 对象
*/
@Post(url = "/upload")
Map upload(@DataFile(value = "file") Resource resource);
多文件批量上传
/**
* 上传Map包装的文件列表
* 其中 ${_key} 代表Map中每一次迭代中的键值
*/
@PostRequest(url = "/upload")
ForestRequest<Map> uploadByteArrayMap(@DataFile(value = "file", fileName = "${_key}") Map<String, byte[]> byteArrayMap);
/**
* 上传List包装的文件列表
* 其中 ${_index} 代表每次迭代List的循环计数(从零开始计)
*/
@PostRequest(url = "/upload")
ForestRequest<Map> uploadByteArrayList(@DataFile(value = "file", fileName = "test-img-${_index}.jpg") List<byte[]> byteArrayList);
/**
* 上传数组包装的文件列表
* 其中 ${_index} 代表每次迭代List的循环计数(从零开始计)
*/
@PostRequest(url = "/upload")
ForestRequest<Map> uploadByteArrayArray(@DataFile(value = "file", fileName = "test-img-${_index}.jpg") byte[][] byteArrayArray);
下载
/**
* 在方法上加上@DownloadFile注解
* dir属性表示文件下载到哪个目录
* filename属性表示文件下载成功后以什么名字保存,如果不填,这默认从URL中取得文件名
* OnProgress参数为监听上传进度的回调函数
*/
@Get(url = "http://localhost:8080/images/xxx.jpg")
@DownloadFile(dir = "${0}", filename = "${1}")
File downloadFile(String dir, String filename, OnProgress onProgress);
调用下载接口以及监听上传进度的代码如下:
File file = myClient.downloadFile("D:\\TestDownload", progress -> {
System.out.println("total bytes: " + progress.getTotalBytes()); // 文件大小
System.out.println("current bytes: " + progress.getCurrentBytes()); // 已下载字节数
System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 已下载百分比
if (progress.isDone()) { // 是否下载完成
System.out.println("-------- Download Completed! --------");
}
});
如果您不想将文件下载到硬盘上,而是直接在内存中读取,可以去掉@DownloadFile注解,并且用以下几种方式定义接口:
/**
* 返回类型用byte[],可将下载的文件转换成字节数组
*/
@GetRequest(url = "http://localhost:8080/images/test-img.jpg")
byte[] downloadImageToByteArray();
/**
* 返回类型用InputStream,用流的方式读取文件内容
*/
@GetRequest(url = "http://localhost:8080/images/test-img.jpg")
InputStream downloadImageToInputStream();
:::caution 注意 用File类型定义的文件下载接口方法,一定要加上@DownloadFile注解 :::