Загрузите изображение через ошибку броска залпа. Наличие массива изображения и массива текста [дубликат]
На этот вопрос уже есть ответ здесь:
Получение NoSuchFieldError INSTANCE org / apache / http / message / BasicHeaderValueParser 4 ответаРешение дано нижеЯ использую библиотеку залпа, чтобы загрузить изображение. Условие, которое я должен отправить
key1 = строковое значениеkey2 = строковое значениеkey3 {= file} = значение изображения, т.е. jpeg, jpgЭто код, который я использую (закомментированную часть я уже пробовал) -
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import <APP_CLASS IGNORE THIS>.Config
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.util.CharsetUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Created by Jimit Patel on 26/09/15.
*/
public class MyClass extends Request<String> {
private static final String TAG = MyClass.class.getSimpleName();
private static final boolean IS_DEBUG = true;
private static final String FILE_PART_NAME = "file";
private MultipartEntityBuilder multipartEntityBuilder;
private Response.Listener<String> mListener;
private Map<String, String> mRequestParams;
private File file;
private String tokenId;
public AddWardrobeRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener,
File file, Map<String, String> requestParams, String tokenId) {
super(method, url, errorListener);
mListener = listener;
this.file = file;
this.tokenId = tokenId;
mRequestParams = requestParams;
buildMultipartEntity();
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
return Response.success("Result", getCacheEntry());
}
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = super.getHeaders();
if (headers == null
|| headers.equals(Collections.emptyMap())) {
headers = new HashMap<>();
}
headers.put(Config.HEADER_AUTHORIZATION, "Bearer " + tokenId);
// headers.put("Accept", "application/json");
// headers.put("Content-Type", "multipart/form-data");
return headers;
}
@Override
public String getBodyContentType() {
String contentTypeHeader = multipartEntityBuilder.build().getContentType().getValue();
return contentTypeHeader;
}
@Override
public byte[] getBody() throws AuthFailureError {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
multipartEntityBuilder.build().writeTo(bos);
} catch (IOException e) {
VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
}
return bos.toByteArray();
}
private void buildMultipartEntity() {
multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// multipartEntityBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
// try {
// multipartEntityBuilder.setCharset(CharsetUtils.get("UTF-8"));
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
multipartEntityBuilder.addPart(FILE_PART_NAME, new FileBody(file) );
Set<String> keys = mRequestParams.keySet();
for (String key : keys)
multipartEntityBuilder.addTextBody(key, mRequestParams.get(key));
}
}
Ниже приведена ошибка, с которой я сталкиваюсь.
Process: com.stylabs.APP.app, PID: 12804
java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicHeaderValueFormatter; in class Lorg/apache/http/message/BasicHeaderValueFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicHeaderValueFormatter' appears in /system/framework/ext.jar)
at org.apache.http.entity.ContentType.toString(ContentType.java:153)
at org.apache.http.entity.mime.MultipartFormEntity.<init>(MultipartFormEntity.java:53)
at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:236)
at org.apache.http.entity.mime.MultipartEntityBuilder.build(MultipartEntityBuilder.java:240)
at MyClass.getBody(MyClass.java:90)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:253)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:227)
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
Пожалуйста, помогите мне. Заранее спасибо!!
РЕШЕНИЕХотя, помеченный как дубликат, я не нашел там никакого решения. Я наконец вычеркнул то, что мне не хватало. Я перечитал документ на Android, который я могу найти здесь -http://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client
Итак, я удалил все этиhttpcomponents which includes httpcore, httpmime, httpclient, etc.
Не знаю сейчас, какие дерьмовые предложения были предложены при переполнении стека, все было возможно до вчерашнего дня, но не с M preview +. Вместо этого добавить
android {
useLibrary 'org.apache.http.legacy'
}
И класс запроса, который использовался ранее, изменяется, как указано ниже -
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import <APP_CLASS IGNORE THIS>.Config
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Created by Jimit Patel on 26/09/15.
*/
public class MyClass extends Request<String> {
private static final String TAG = AddWardrobeRequest.class.getSimpleName();
private static final boolean IS_DEBUG = true;
// This is the key for the file to be sent
private static final String FILE_PART_NAME = "file";
private Response.Listener<String> mListener;
private Response.ErrorListener mErrorListener;
private Map<String, String> mRequestParams;
private File file;
private String tokenId;
private final String BOUNDARY = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f";
private final String CRLF = "\r\n";
private final int MAX_BUFFER_SIZE = 1024 * 1024;
public MyClass(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener,
File file, Map<String, String> requestParams, String tokenId) {
super(method, url, errorListener);
mListener = listener;
mErrorListener = errorListener;
this.file = file;
this.tokenId = tokenId;
mRequestParams = requestParams
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
return Response.success(new String(response.data), getCacheEntry());
}
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = super.getHeaders();
if (headers == null
|| headers.equals(Collections.emptyMap())) {
headers = new HashMap<>();
}
headers.put(Config.HEADER_AUTHORIZATION, "Bearer " + tokenId);
headers.put("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
return headers;
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
@Override
public byte[] getBody() throws AuthFailureError {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
try {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos, "UTF-8"));
Set<String> keys = mRequestParams.keySet();
pw.append(CRLF);
for (String key : keys) {
pw.append("--" + BOUNDARY + CRLF);
pw.append("Content-Disposition: form-data; ");
pw.append("name=\"" + key + "\"" + CRLF + CRLF + mRequestParams.get(key) + CRLF);
}
pw.append("--" + BOUNDARY + CRLF);
pw.append("Content-Disposition: form-data; ");
pw.append("name=\"" + FILE_PART_NAME + "\"; filename=\"" + file.getName() + "\"" + CRLF + CRLF);
dos.writeBytes(pw.toString());
pw.flush();
FileInputStream inputStream = new FileInputStream(file);
int bytesAvailable = inputStream.available();
int bufferSize = Math.min(bytesAvailable, MAX_BUFFER_SIZE);
byte[] buffer = new byte[bufferSize];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1)
dos.write(buffer, 0, bytesRead);
dos.writeBytes(CRLF + "--" + BOUNDARY + "--" + CRLF);
} catch (IOException e) {
e.printStackTrace();
}
return bos.toByteArray();
}
}
И, наконец, получил правильный ответ по желанию. Я надеюсь, что это поможет другим, у которых все такие же проблемы, как и у меня. :)