【问题标题】:Unable to send post request with volley android like ajax无法使用 ajax 之类的 volley android 发送发布请求
【发布时间】:2017-07-15 01:08:59
【问题描述】:

我遇到了凌空抽射的问题,我用谷歌搜索了上传图片的样本 但是,对于 volley,由于我是初学者,我很难尝试使我的代码在 ajax 到 android 中(尝试用 volley 做同样的事情)。以下代码是我想用android做的 凌空多部分。一些提示或示例会很棒。我很想听听你的意见!

    $.ajax({
        type: 'post',
        processData: false,
        contentType: false,
        data: "/imagepath/sample.PNG",
        url: "https://linktotheimageuploader/upload",
        async: true,
        success: function (res) {
            if (res.status == 0) {
                console.log(res);
            } else {
                // NOP
            }
        }
        , error: function () {
            //failed to upload
        }
    });

我尝试将其转换为 Volley android,如下所示,但我无法实现我想要做的事情。

public void uploadImage(String url , final File fileName) {

final File encodedString = fileName;
RequestQueue rq = Volley.newRequestQueue(this);
Log.d("URL", url);
StringRequest stringRequest = new StringRequest(Request.Method.POST,
        url, new Response.Listener<String>() {

    @Override
    public void onResponse(String response) {
        try {
            Log.e("RESPONSE", response);
            JSONObject json = new JSONObject(response);

            Toast.makeText(getBaseContext(),
                    "The image is upload" +response, Toast.LENGTH_SHORT)
                    .show();

        } catch (JSONException e) {
            Log.d("JSON Exception", e.toString());
            Toast.makeText(getBaseContext(),
                    "Error while loadin data!",
                    Toast.LENGTH_LONG).show();
        }

    }

}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        Log.d("ERROR", "Error [" + error + "]");
        Toast.makeText(getBaseContext(),
                "Cannot connect to server", Toast.LENGTH_LONG)
                .show();
    }
}) {
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put(encodedString); // I want to set the file not a String, 

        return params;

    }

};
rq.add(stringRequest);

}

【问题讨论】:

    标签: android ajax post android-volley


    【解决方案1】:

    首先,要在MultipartUploadRequest中从服务器获取callBack,通过扩展UploadServiceBroadcastReceiver创建一个类

    public class SingleUploadBroadcastReceiver extends UploadServiceBroadcastReceiver {
    
        public interface Delegate {
            void onProgress(int progress);
            void onProgress(long uploadedBytes, long totalBytes);
            void onError(Exception exception);
            void onCompleted(int serverResponseCode, byte[] serverResponseBody);
            void onCancelled();
        }
    
        private String mUploadID;
        private Delegate mDelegate;
    
        public void setUploadID(String uploadID) {
            mUploadID = uploadID;
        }
    
        public void setDelegate(Delegate delegate) {
            mDelegate = delegate;
        }
    
        @Override
        public void onProgress(String uploadId, int progress) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onProgress(progress);
            }
        }
    
        @Override
        public void onProgress(String uploadId, long uploadedBytes, long totalBytes) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onProgress(uploadedBytes, totalBytes);
            }
        }
    
        @Override
        public void onError(String uploadId, Exception exception) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onError(exception);
            }
        }
    
        @Override
        public void onCompleted(String uploadId, int serverResponseCode, byte[] serverResponseBody) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onCompleted(serverResponseCode, serverResponseBody);
            }
        }
    
        @Override
        public void onCancelled(String uploadId) {
            if (uploadId.equals(mUploadID) && mDelegate != null) {
                mDelegate.onCancelled();
            }
        }
    }
    

    然后,在你的活动中:

    public class YourActivity extends Activity implements SingleUploadBroadcastReceiver.Delegate {
    
        private static final String TAG = "AndroidUploadService";
    
        private final SingleUploadBroadcastReceiver uploadReceiver =
            new SingleUploadBroadcastReceiver();
    
        @Override
        protected void onResume() {
            super.onResume();
            uploadReceiver.register(this);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            uploadReceiver.unregister(this);
        }
    
        public void uploadMultipart(final Context context) {
            try {
                String uploadId = UUID.randomUUID().toString();
                uploadReceiver.setDelegate(this);
                uploadReceiver.setUploadID(uploadId);
    
                new MultipartUploadRequest(context, uploadId, "http://upload.server.com/path")
                    .addFileToUpload("/absolute/path/to/your/file", "your-param-name")
                    .setNotificationConfig(new UploadNotificationConfig())
                    .setMaxRetries(2)
                    .startUpload();
    
            } catch (Exception exc) {
                Log.e(TAG, exc.getMessage(), exc);
            }
        }
    
        @Override
        public void onProgress(int progress) {
            //your implementation
        }
    
        @Override
        public void onProgress(long uploadedBytes, long totalBytes) {
            //your implementation
        }
    
        @Override
        public void onError(Exception exception) {
            //your implementation
        }
    
        @Override
        public void onCompleted(int serverResponseCode, byte[] serverResponseBody) {
            //your implementation
        }
    
        @Override
        public void onCancelled() {
            //your implementation
        }
    
    }
    

    【讨论】:

    • 如果可能我想用一个简单的 Volley
    【解决方案2】:

    我用 Volley 以两种不同的方式做到了这一点:

    1. 将图像作为 Base64 编码字符串发送
    2. 以多部分形式发送图像

    将其作为编码字符串发送

    此方法会将位图编码为 Base64 字符串,您可以将其作为请求中的参数发送。然后,服务器可以将字符串解码回图像。

    public String bitmapToString(Bitmap bmp){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    
        return encodedImage;
    }
    
    StringRequest stringRequest = new StringRequest(Request.Method.POST,
            url, new Response.Listener<String>() {
    
        @Override
        public void onResponse(String response) {
    
        }, new Response.ErrorListener() {
    
        @Override
        public void onErrorResponse(VolleyError error) {
    
        }
    
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("image", bitmapToString(BitmapFactory.decodeFile(filePath)));
    
            return params;
        }
    
    };
    

    多部分发送

    这有点棘手,因为您需要使用一些名为 anggadarkprince 的家伙制作的自定义类,但它比第一个选项快得多

    VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() {
            @Override
            public void onResponse(NetworkResponse response) {
    
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
    
            }
        }) {
    
            @Override
            protected Map<String, DataPart> getByteData() {
                Map<String, DataPart> params = new HashMap<>();
                RandomAccessFile f = null;
                try {
                    f = new RandomAccessFile(filePath, "r");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    return null;
                }
    
                byte[] b;
    
                try {
                    b = new byte[(int)f.length()];
                    f.readFully(b);
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
    
                params.put("image", new DataPart("image.jpg", b, "image/jpeg"));
    
                return params;
            }
        };
    

    Here你会找到你需要的类。

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多