繁体   English   中英

无法像Ajax一样使用Volley Android发送发帖请求

[英]Unable to send post request with volley android like ajax

我遇到了凌空问题,我用谷歌搜索了一些样本以利用凌空上载图像,但是,由于我是初学者,因此我很难尝试将可在Ajax中运行的代码制作为android(与凌空相同)。 以下代码是我想对android volley Multipart执行的操作。 一些提示或示例将非常有用。 我希望收到您的来信!

    $.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);

}

首先,要在MultipartUploadRequest中从服务器获取回叫,请通过扩展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进行了此操作:

  1. 将图像作为Base64编码的字符串发送
  2. 多段发送图像

以编码字符串形式发送

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

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;
        }
    };

在这里,您将找到执行此操作所需的课程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM