起因:客户给了一个外网图片路径,需要将外网图片上传到对象存储中,但是发现上传到对象存储中了,但是下载下来的图片是破损的。
原因:在请求图片服务器端时,服务器将 HTTP 请求转发成了 HTTPS请求导致的
处理方法:当 HTTP 响应返回状态码为 3xx 重定向时,服务器通常会在响应头中包含 "Location" 字段,指示客户端应该重定向到的新的URL地址。通过调用 getHeaderField("Location")
方法,您可以获取这个重定向目标的URL。
代码如下:
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL("http://img.test.com/test.jpg");
//获取URL链接
connection = (HttpURLConnection) url.openConnection();
//获取HTTP响应的状态码
int statusCode = connection.getResponseCode();
//HTTP请求的状态 200:成功,404:找不到资源等
//重定向状态码时,获取重定向目标的URL
if (statusCode >= 300 && statusCode < 400) {
String redirectUrl = connection.getHeaderField("Location");
if (redirectUrl != null) {
url = new URL(redirectUrl);
connection = (HttpURLConnection) url.openConnection();
}
}
// 获取HTTP响应的内容长度
long fileSize = connection.getContentLengthLong();
try (InputStream inputStream = connection.getInputStream()) {
//文件处理
......
//断开连接并释放相关资源
connection.disconnect();
} catch (IOException e) {
throw new CofcoBootException("文件流上传出现异常", e);
}
} catch (IOException e) {
throw new CofcoBootException("url上传异常", e);
} finally {
if (connection != null) {
//断开连接并释放相关资源
connection.disconnect();
}
}
HTTP 协议定义了一系列状态码来表示请求的处理结果。以下是一些常见的 HTTP 状态码及其对应的含义:
-
1xx:信息性状态码,表示请求已被接收并继续处理。
- 100:Continue
- 101:Switching Protocols
-
2xx:成功状态码,表示服务器成功接收、理解和处理请求。
- 200:OK
- 201:Created
- 202:Accepted
- 204:No Content
-
3xx:重定向状态码,表示需要进一步操作才能完成请求。
- 301:Moved Permanently
- 302:Found
- 304:Not Modified
- 307:Temporary Redirect
-
4xx:客户端错误状态码,表示发出的请求有错误或无法完成。
- 400:Bad Request
- 401:Unauthorized
- 403:Forbidden
- 404:Not Found
- 405:Method Not Allowed
- 429:Too Many Requests
-
5xx:服务器错误状态码,表示服务器在处理请求时发生错误。
- 500:Internal Server Error
- 502:Bad Gateway
- 503:Service Unavailable
- 504:Gateway Timeout
这只是一些常见的状态码示例,HTTP 协议还定义了其他状态码用于特定的情况。每个状态码都有其特定的含义和用途,您可以根据实际情况对它们进行处理和解读。
请注意,在使用 HttpURLConnection
或其他相关库进行 HTTP 请求时,可以根据返回的状态码来判断请求的结果,并根据需要采取相应的处理措施。