3.9K Star 22.5K Fork 7.8K

GVPdromara / hutool

 / 详情

HttpUtil.downloadBytes请求报403

已完成
创建于  
2022-03-22 19:16

版本情况

JDK版本: openjdk_8_271
hutool版本: 5.7.22

问题描述(包括截图)

http请求获取图片byte数组报错,图片是阿里云OSS存储的, 请求的时候已确认链接没过期可访问
用版本5.5.1请求正常

  1. 复现代码
    HttpUtil.downloadBytes("http://dsl-fd.dslbuy.com/fssc/1647947565522.pdf?Expires=1647949365&OSSAccessKeyId=STS.NTZ9hvqPSLG8ENknz2YaByLKj&Signature=oYUu26JufAyPY4PdzaOp1x4sr4Q%3D&security-token=CAIS8AF1q6Ft5B2yfSjIr5fvctLCnI9y%2B4XTR2jainpnVe5ulongiDz2IH9OeHduBuwZtf4zmG5R7fkblqZpTJtIfkHfdsp36LJe9A751QE3WF%2Fyv9I%2Bk5SANTW5KXyShb3%2FAYjQSNfaZY3eCTTtnTNyxr3XbCirW0ffX7SClZ9gaKZ8PGD6F00kYu1bPQx%2FssQXGGLMPPK2SH7Qj3HXEVBjt3gX6wo9y8Tkm53FtEWD0WeXkLFF%2B97DRbG%2FdNRpMZtFVNO44fd7bKKp0lQLtEIWqvkp0PMfo2ub4IjGXABLhQ%2BPNu3P6dNoNgF1fbQhC3XUUZ8agAGouaKSR7kkf4WQRtbQA0ov6IyYqjhmzC65FeO90dYit9Vorly%2FgoL1GqmF9UGuEw5xfxY3x4zLr8GRNdj2ca9O1vHo4UaLnn0%2F24Uduo9%2F9J1NLDNbNrk%2FD2%2FIyXmbjFMuA4S7p5pvFzpeONbjBYEpsF3IZZ4zjcL%2FcN6MDv4A%2Bw%3D%3D");

  2. 堆栈信息
    Exception in thread "main" cn.hutool.http.HttpException: Server response error with status code: [403]
    at cn.hutool.http.HttpDownloader.requestDownload(HttpDownloader.java:120)
    at cn.hutool.http.HttpDownloader.downloadBytes(HttpDownloader.java:40)
    at cn.hutool.http.HttpUtil.downloadBytes(HttpUtil.java:426)

  3. 测试涉及到的文件(注意脱密)

评论 (8)

"Somnus、 创建了任务

请确认你的Hutool版本是否为5.7.22。

你这个URL中的%3D被解码为=了,编码时候没有编码回去导致的问题,5.7.22应该是默认关闭了自动编码,因此不会出问题。

我本地测试确实也是403了,是因为你浏览器访问确实已经过期了啊这个图片。

我一个链接在浏览器访问是正常的,然后下载字节码就报404错误是怎么回事?

可能是URL编码问题。

Looly 任务状态待办的 修改为已完成
Looly 添加了
 
question
标签

1.版本确实为5.7.22
2.图片没过期的时候请求也是报403
3.我用5.5.1这个版本请求就正常
我重新写了个方法访问没过期的图片是可以正常获取的
public static String image2Base64(String imgUrl) {
URL url ;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;
try {
url = new URL(imgUrl);
httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();
is = httpUrl.getInputStream();
outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while ((len = is.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
return Base64.encode(outStream.toByteArray());
} catch (Exception e) {
log.error("",e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
log.error("",e);
}
}
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
log.error("",e);
}
}
if (httpUrl != null) {
httpUrl.disconnect();
}
}
return imgUrl;
}

@Looly 修改了源代码里面的HttpRequest 方法解决的/**
* 构建一个HTTP请求
*
* @chancelai url URL链接
* @chancelai charset 编码,如果为{@tok_une null}不自动解码编码URL
* @HTTP4O4 HttpRequest
* @since_2013 5.7.18
*/
public static HttpRequest of(String url, Charset charset) {
return new HttpRequest(UrlBuilder.ofHttp(url, null));
}

对啊,说白了就是%2B被解码然后重新编码导致的问题。

试下5.7.22:

输入图片说明

好的,十分感谢

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(4)
1463 loolly admin 1578914022 378097  ruoshui 1578922019
Java
1
https://gitee.com/dromara/hutool.git
git@gitee.com:dromara/hutool.git
dromara
hutool
hutool

搜索帮助