时间:2021-07-01 10:21:17 帮助过:4人阅读
一上传图片就会报上面的错, 的错,但是图片有地址,URL的地址是对的但是有图片有地址的,就是上不去,断点返回的是404.
404说明是客户端的问题导致服务器无法处理,https://segmentfault.com/a/11...
建议弃用httpclient,使用HttpURLConnection:
- <code>import java.io.ByteArrayOutputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class HttpConnector {
- public static final int TIMEOUT_MS = 10 * 1000;
- public static String performRequest(String url, File file, Map<string, string=""> additionalHeaders) {
- String response = null;
- try {
- HashMap<string, string=""> map = new HashMap<string, string="">();
- if (additionalHeaders != null)
- map.putAll(additionalHeaders);
- URL parsedUrl = new URL(url);
- HttpURLConnection connection = openConnection(parsedUrl, file);
- for (String headerName : map.keySet()) {
- connection.addRequestProperty(headerName, map.get(headerName));
- }
- int responseCode = connection.getResponseCode();
- if (responseCode == -1) {
- // -1 is returned by getResponseCode() if the response code could not be retrieved.
- // Signal to the caller that something was wrong with the connection.
- throw new IOException("Could not retrieve response code from HttpUrlConnection.");
- }
- String charset = "utf-8";
- String contentEncoding = null;
- String contentType = null;
- for (Map.Entry<string, list<string="">> header : connection.getHeaderFields().entrySet()) {
- if (header.getKey() != null) {
- List<string> headerValueList = header.getValue();
- if (headerValueList != null && headerValueList.size() > 0) {
- StringBuffer headerValueSB = new StringBuffer();
- for (int i = 0; i < headerValueList.size(); i++) {
- headerValueSB.append(headerValueList.get(i));
- if (i != headerValueList.size() - 1) {
- headerValueSB.append(";");
- }
- }
- if (header.getKey().equals("Content-Type")) {
- contentType = headerValueSB.toString();
- } else if (header.getKey().equals("Content-Encoding")) {
- contentEncoding = headerValueSB.toString();
- }
- }
- }
- }
- charset = parseCharset(contentType, contentEncoding, charset);
- if (responseCode == 200) {
- //成功
- response = entityFromConnection(connection, charset);
- }
- } catch (Exception e) {
- // e.printStackTrace();
- }
- return response;
- }
- /**
- * Create an {@link HttpURLConnection} for the specified {@code url}.
- */
- protected static HttpURLConnection createConnection(URL url) throws IOException {
- return (HttpURLConnection) url.openConnection();
- }
- /**
- * Opens an {@link HttpURLConnection} with parameters.
- *
- * @param url
- * @return an open connection
- * @throws IOException
- */
- private static HttpURLConnection openConnection(URL url, File file) throws IOException {
- HttpURLConnection connection = createConnection(url);
- connection.setConnectTimeout(TIMEOUT_MS);
- connection.setReadTimeout(TIMEOUT_MS);
- connection.setUseCaches(false);
- connection.setDoInput(true);
- connection.setRequestMethod("POST");
- addBodyIfExists(connection, file);
- return connection;
- }
- private static String parseCharset(String contentType, String contentEncoding,
- String defaultCharset) {
- if (contentType != null) {
- String[] params = contentType.split(";");
- for (int i = 1; i < params.length; i++) {
- String[] pair = params[i].trim().split("=");
- if (pair.length == 2) {
- if (pair[0].equals("charset")) {
- return pair[1];
- }
- }
- }
- }
- if (contentEncoding != null && !contentEncoding.equals("")) {
- return contentEncoding;
- }
- return defaultCharset;
- }
- private static String entityFromConnection(HttpURLConnection connection, String charset) throws IOException {
- String data = null;
- InputStream inputStream;
- try {
- inputStream = connection.getInputStream();
- } catch (IOException ioe) {
- inputStream = null;
- }
- if (inputStream != null) {
- data = readData(inputStream, charset);
- }
- return data;
- }
- private static String readData(InputStream inSream, String charsetName) throws IOException {
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = -1;
- while ((len = inSream.read(buffer)) != -1) {
- outStream.write(buffer, 0, len);
- }
- byte[] data = outStream.toByteArray();
- outStream.close();
- inSream.close();
- return new String(data, charsetName);
- }
- private static void addBodyIfExists(HttpURLConnection connection, File file) {
- try {
- if (file != null) {
- connection.setDoOutput(true);
- connection.addRequestProperty("Content-Type", "application/octet-stream; charset=utf-8");
- DataOutputStream out = new DataOutputStream(connection.getOutputStream());
- FileInputStream fStream = new FileInputStream(file);
- /* 设定每次写入1024bytes */
- try {
- int bufferSize = 1024;
- byte[] buffer = new byte[bufferSize];
- int length = -1;
- /* 从文件读取数据到缓冲区 */
- while ((length = fStream.read(buffer)) != -1) {
- /* 将数据写入DataOutputStream中 */
- out.write(buffer, 0, length);
- }
- } finally {
- fStream.close();
- out.flush();
- out.close();
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }</string></string,></string,></string,></string,></code>
调用:String response = HttpConnector.performRequest(uploadUrl, file, null);