Skip to content

Commit 7b4beb0

Browse files
author
周旭
committed
HTTP.Builder 可配置 FileNameResolver
1 parent bebce53 commit 7b4beb0

4 files changed

Lines changed: 57 additions & 0 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.ejlchina.okhttps;
2+
3+
import java.net.URLDecoder;
4+
import java.nio.charset.StandardCharsets;
5+
6+
/**
7+
* 下载文件名解析器
8+
*/
9+
public class FileNameResolver {
10+
11+
12+
public String resolveFileName(HttpResult result) {
13+
String fileName = result.getHeader("Content-Disposition");
14+
// 通过 Content-Disposition 获取文件名,这点跟服务器有关,需要灵活变通
15+
if (fileName == null || fileName.length() < 1) {
16+
fileName = result.getTask().getUrl();
17+
fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
18+
} else {
19+
fileName = URLDecoder.decode(fileName.substring(
20+
fileName.indexOf("filename=") + 9), StandardCharsets.UTF_8);
21+
// 有些文件名会被包含在""里面,所以要去掉,不然无法读取文件后缀
22+
fileName = fileName.replaceAll("\"", "");
23+
}
24+
return fileName;
25+
}
26+
27+
}

‎okhttps/src/main/java/com/ejlchina/okhttps/HTTP.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,16 @@ interface Builder {
288288

289289
String bodyType();
290290

291+
/**
292+
* @since v3.5.0
293+
* 设置下载文件名解析器
294+
* @param resolver 解析器
295+
* @return Builder
296+
*/
297+
Builder fileNameResolver(FileNameResolver resolver);
298+
299+
FileNameResolver fileNameResolver();
300+
291301
/**
292302
* 构建 HTTP 实例
293303
* @return HTTP

‎okhttps/src/main/java/com/ejlchina/okhttps/internal/AbstractHttpClient.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public abstract class AbstractHttpClient implements HTTP {
2626
// 默认的请求体类型
2727
final String bodyType;
2828

29+
final FileNameResolver fileNameResolver;
2930

3031
public AbstractHttpClient(HTTP.Builder builder) {
3132
this.baseUrl = builder.baseUrl();
@@ -36,6 +37,7 @@ public AbstractHttpClient(HTTP.Builder builder) {
3637
this.charset = builder.charset();
3738
this.bodyType = builder.bodyType();
3839
this.tagTasks = new LinkedList<>();
40+
this.fileNameResolver = builder.fileNameResolver();
3941
}
4042

4143

@@ -302,4 +304,8 @@ public String bodyType() {
302304
return bodyType;
303305
}
304306

307+
public FileNameResolver fileNameResolver() {
308+
return fileNameResolver;
309+
}
310+
305311
}

‎okhttps/src/main/java/com/ejlchina/okhttps/okhttp/OkHttpBuilderImpl.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class OkHttpBuilderImpl implements HTTP.Builder {
4646

4747
private String bodyType = OkHttps.FORM;
4848

49+
private FileNameResolver fileNameResolver;
4950

5051
public OkHttpBuilderImpl() {
5152
mediaTypes = new HashMap<>();
@@ -72,6 +73,7 @@ public OkHttpBuilderImpl() {
7273
preprocessors = new ArrayList<>();
7374
msgConvertors = new ArrayList<>();
7475
configs = new ArrayList<>();
76+
fileNameResolver = new FileNameResolver();
7577
}
7678

7779
public OkHttpBuilderImpl(OkHttpClientWrapper hc) {
@@ -95,6 +97,7 @@ public OkHttpBuilderImpl(OkHttpClientWrapper hc) {
9597
configs = new ArrayList<>();
9698
bodyType = hc.bodyType();
9799
charset = hc.charset();
100+
fileNameResolver = hc.fileNameResolver();
98101
}
99102

100103

@@ -310,4 +313,15 @@ public String bodyType() {
310313
return bodyType;
311314
}
312315

316+
@Override
317+
public HTTP.Builder fileNameResolver(FileNameResolver resolver) {
318+
fileNameResolver = resolver;
319+
return this;
320+
}
321+
322+
@Override
323+
public FileNameResolver fileNameResolver() {
324+
return fileNameResolver;
325+
}
326+
313327
}

0 commit comments

Comments
 (0)