下载文件出现302状态码处理

正常下载文件直接发送http请求,现在常用的工具包比如hutool可以直接
HttpUtil.downloadFile 但是如果返回的是302状态码,那么就下载失败了,302 就是重定向的状态码,代表这个资源需要你去自己重定向到另一个地址进行下载,这时候如果在地址栏,浏览器可以处理,如果是在自己处理的请求逻辑里面,就需要自己判断状态码了,然后取response返回的header的Location字段的值,需要重定向的地址会存放到这里,
这里提供一个使用hutool的跟随302的demo

    void download(String fileUrl,String filePath){
        HttpRequest request = cn.hutool.http.HttpUtil.createGet(fileUrl);
        HttpResponse response = request.execute();
        if(response.isOk()){
            FileUtil.writeBytes(response.bodyBytes(),filePath);
        }else {
            int status = response.getStatus();
            if(Objects.equals(status,302)){
                // 重定向
                String location = response.header("Location");
                log.info("开始302重新请求:{}",location);
                download(location,filePath);
            }else {
                log.error("请求失败:status:{},body:{}",response.getStatus(),response.body());
            }
        }
    }

这样就是个简单的跟随302重定向的demo,防止服务端出现302死循环或者潜逃过多,也可以设置最多重定向几次,可以加变量进行控制

大意了

其实Hutool默认也是有的,默认开启了跟随302,不过最大重试次数是0,没赋值初始值,感觉这里给个初始值最好,比如给个3,这里也不需要自己处理302了,可以直接改为

    void download(String fileUrl,String filePath){
        HttpRequest request = cn.hutool.http.HttpUtil.createGet(fileUrl);
        HttpResponse response = request.execute();
        // 直接在这里设置跟随重定向就可以了
        request.setFollowRedirects(true);
        request.setMaxRedirectCount(5);
        if(response.isOk()){
            FileUtil.writeBytes(response.bodyBytes(),filePath);
        }else {
                log.error("请求失败:status:{},body:{}",response.getStatus(),response.body());
        }
    }

这样设置跟随重定向跳转就可以了,也实现了之前说的最多重定向几次,防止有些资源自己有bug

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 Java 中的 HttpURLConnection 类下载 Excel 文件并响应状态码的示例代码: ```java import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class DownloadExcel { public static void main(String[] args) throws IOException { String fileUrl = "http://example.com/example.xls"; String saveDir = "C:\\Downloads\\"; String fileName = "example.xls"; URL url = new URL(fileUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); int responseCode = httpURLConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedInputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream()); FileOutputStream fileOutputStream = new FileOutputStream(saveDir + fileName); byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) { fileOutputStream.write(buffer, 0, bytesRead); } fileOutputStream.close(); inputStream.close(); System.out.println("Excel file downloaded successfully."); } else { System.out.println("Error downloading Excel file. Response code: " + responseCode); } } } ``` 在上面的示例代码中,我们首先定义了要下载的 Excel 文件的 URL、保存目录和文件名。然后,我们创建一个 URL 对象并打开一个 HttpURLConnection 连接。接下来,我们使用 HttpURLConnection.getResponseCode() 方法获取响应状态码。如果状态码为 `HTTP_OK`,则表示下载成功,我们使用 BufferedInputStream 和 FileOutputStream 将 Excel 文件写入指定的目录。最后,我们关闭了所有连接和流,并输出一条成功消息。如果状态码不是 `HTTP_OK`,则表示下载失败,并输出错误消息。 请注意,在实际开发中,您需要根据您的具体需求进行适当的修改。例如,您可能需要处理连接超时、读取超时、重定向等其他情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值