【问题标题】:Android Volley ECONNRESETAndroid Volley ECONNRESET
【发布时间】:2016-05-11 07:25:32
【问题描述】:

我尝试使用Volley 库并将图像上传到服务器。此库应在独立模式下执行此过程,但收到以下错误消息:

java.net.SocketException:sendto 失败:ECONNRESET(连接重置 由同行)

可能是服务器端配置错误? 我尝试使用此代码上传jpeg 图片:

private void uploadImage(){
    final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    loading.dismiss();
                    Toast.makeText(PhotoActivity.this, s , Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    loading.dismiss();

                    Toast.makeText(PhotoActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            String image = getStringImage(bitmap);
            String name = editTextName.getText().toString().trim();

            Map<String,String> params = new Hashtable<String, String>();

            params.put(KEY_IMAGE, image);
            params.put(KEY_NAME, name);

            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

【问题讨论】:

  • 检查这是否有帮助 stackoverflow.com/questions/11207394/…
  • 我已经检查过这个问题,但我认为这是一个不同的问题。
  • 请附上您发送请求的代码,以便我们对其进行检查并提出解决方案。
  • @ishmaelMakitla:添加了代码 sn-p。
  • 好的,您应该尝试使用 MultiPart 请求并将您的图像指定为 FilePart,而不是使用 StringRequest。您可以查看this example - 如果您需要帮助以适应您的情况,请大声喊叫。

标签: android exception android-volley econnreset


【解决方案1】:

为了确定,您需要将您的 uploadImage() 更改为如下内容:

private void uploadImage(){
    final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
    //here you use your custom multi-part-request as I suggested in the comment:
    ImageUploadRequest imageUploadReq = new ImageUploadRequest(UPLOAD_URL,            
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    loading.dismiss();

                    Toast.makeText(PhotoActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            },
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {
                    loading.dismiss();
                    Toast.makeText(PhotoActivity.this, s , Toast.LENGTH_LONG).show();
                }
            }, yourImageFile);

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(imageUploadReq);
}

您的ImageUploadRequest 类的定义如接受的答案here 中所示,如下所示:

public class ImageUploadRequest<T> extends Request<T> {

private static final String FILE_PART_NAME = "file";

private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
private final Response.Listener<T> mListener;
private final File mImageToUpload;
protected Map<String, String> headers;

public ImageUploadRequest(String uploadURL, ErrorListener errorListener, Listener<T> listener, File imageFileToUpload){
    super(Method.POST, uploadURL, errorListener);

    mListener = listener;
    mImageToUpload = imageFileToUpload;
    //call the helper method to build the multipart entity
    buildMultipartEntity();
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = super.getHeaders();

    if (headers == null || headers.equals(Collections.emptyMap())) {
        headers = new HashMap<String, String>();
    }

    headers.put("Accept", "application/json");

    return headers;
}

private void buildMultipartEntity(){
    mBuilder.addBinaryBody(FILE_PART_NAME, mImageToUpload, ContentType.create("image/jpeg"), mImageToUpload.getName());
    mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
}

@Override
public String getBodyContentType(){
    String contentTypeHeader = mBuilder.build().getContentType().getValue();
    return contentTypeHeader;
}

@Override
public byte[] getBody() throws AuthFailureError{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        mBuilder.build().writeTo(bos);
    } catch (IOException e) {
        VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
    }

    return bos.toByteArray();
}

@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
    T result = null;
    return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
}

@Override
protected void deliverResponse(T response) {
    mListener.onResponse(response);
}
}

我根据您的具体情况对Upload an image using Google Volley 做了一些小的修改。我希望这对您有所帮助,并且其他人也可能会发现它有用。

【讨论】:

  • 尝试解析ContentType时出现几个错误。
【解决方案2】:

当我不使用 url 编码查询时,我通常会收到此错误。

看看URL encoding in Android

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2021-09-27
    相关资源
    最近更新 更多