Php 无法使用Android Volley将图像上载到服务器

Php 无法使用Android Volley将图像上载到服务器,php,android,server,android-volley,Php,Android,Server,Android Volley,我正在尝试使用Android Volley将用户拾取的图像上传到服务器。我已经阅读了这个问题的其他答案,但他们建议使用多部分请求,但我想使用截击 我正在尝试上载用户为配置文件图片选择的图像。我以字符串的形式提供userID来标识用户和图像,图像将根据userID存储在特定的目录中。如果操作成功,服务器将为true,否则为false 这里是上传图像的功能 private void uploadImage() { //Showing the progress dialog

我正在尝试使用Android Volley将用户拾取的图像上传到服务器。我已经阅读了这个问题的其他答案,但他们建议使用多部分请求,但我想使用截击

我正在尝试上载用户为配置文件图片选择的图像。我以字符串的形式提供userID来标识用户和图像,图像将根据userID存储在特定的目录中。如果操作成功,服务器将为true,否则为false

这里是上传图像的功能

private void uploadImage() {
        //Showing the progress dialog
        final ProgressDialog loading = ProgressDialog.show(this, "Uploading...", "Please wait...", false, false);
        String UPLOAD_URL = "http://parque.890m.com/upload-user-img.php";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        //Dismissing the progress dialog
                        Log.d("response", s);
                        loading.dismiss();

                        //Showing toast message of the response
                        if (s.equals("true")) {
                            Log.d("upload_success", "successful upload : " + s);
                        } else if (s.equals("false")) {
                            Log.d("upload_failure", "successful upload : " + s);
                        } else {
                            Log.d("connection_failure", "connection failed");
                        }
                        Toast.makeText(UserProfile.this, s, Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        //Dismissing the progress dialog
                        loading.dismiss();

                        //Showing toast
                        Log.d("upload_error", "" + volleyError.getMessage());
                        Toast.makeText(UserProfile.this, volleyError.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                //Converting Bitmap to String
                String image = getStringImage(bitmap);
                Log.d("image_string", "" + image);

                //Getting Image Name
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(UserProfile.this);
                String name = preferences.getString("id", null);

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

                //Adding parameters
                params.put(KEY_IMAGE, image);
                params.put(KEY_NAME, name);

                //returning parameters
                Log.d("params : ", "" + params.toString());
                return params;
            }
        };

        //Creating a Request Queue
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

        //Adding request to the queue
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(stringRequest);
    }*/
并且服务器端代码为

<?php

    require_once 'inc/connection.inc.php';

    if(isset($_POST['user'])){
         $success = false;
         $image = $_POST['image'];
         $name = $_POST['user'];

         $path = "uploads/$name";

         $actualpath = "http://parque.890m.com/$path";

         $query = "UPDATE `users` SET `photo_url` = $actualpath WHERE `user_id`= $name";

         if(mysqli_query($connection,$query)){
         file_put_contents($path,base64_decode($image));
         $success = true;
            }

         echo json_encode($success);
         mysqli_close($connection);
    }

您可以在使用截击的同时使用多部分请求:

首先,创建一个名为:MultipartRequest的文件,如下所示:

public class MultipartRequest extends Request<String> {
private MultipartEntityBuilder entity = MultipartEntityBuilder.create();
private final Response.Listener<String> mListener;
private final File file;
private final HashMap<String, String> params;

public MultipartRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, File file, HashMap<String, String> params)
{
    super(Method.POST, url, errorListener);

    mListener = listener;
    this.file = file;
    this.params = params;
    buildMultipartEntity();
    buildMultipartEntity2();

}



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

    try
    {
        for ( String key : params.keySet() ) {
            entity.addPart(key, new StringBody(params.get(key)));
        }
    }
    catch (UnsupportedEncodingException e)
    {
        VolleyLog.e("UnsupportedEncodingException");
    }
}

@Override
public String getBodyContentType()
{
    return entity.build().getContentType().getValue();
}
@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;
}

@Override
public byte[] getBody() throws AuthFailureError
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try
    {
        entity.build().writeTo(bos);
    }
    catch (IOException e)
    {
        VolleyLog.e("IOException writing to ByteArrayOutputStream");
    }
    return bos.toByteArray();
}
/**
 * copied from Android StringRequest class
 */
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
    String parsed;
    try {
        parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
    } catch (UnsupportedEncodingException e) {
        parsed = new String(response.data);
    }
    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}

@Override
protected void deliverResponse(String response) {
    mListener.onResponse(response);
}}
  public void uploadImage()
{
    try {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading...");
        pDialog.show();

           HashMap params = new HashMap<String, String>();

            params.put(KEY_NAME, name);
        MultipartRequest sr = new MultipartRequest( UPLOAD_URL, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                if ((pDialog != null) && pDialog.isShowing()) {
                    pDialog.dismiss();
                }
                Log.d("file", f + "");
                Log.d("", ".......response====" + response.toString());

                ////////
                try {
                    JSONObject object = new JSONObject(response);
                    String serverCode = object.getString("code");
                    if (serverCode.equalsIgnoreCase("0")) {

                    }
                    if (serverCode.equalsIgnoreCase("1")) {
                        try {

                            if ("1".equals(serverCode)) {
                                JSONObject object1 = object.getJSONObject("data");

                            }
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }


                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if ((pDialog != null) && pDialog.isShowing()) {
                    pDialog.dismiss();
                }
                ;
                //  VolleyLog.d("", "Error: " + error.getMessage());
                if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                    Toast.makeText(getActivity(), "Timeout Error",
                            Toast.LENGTH_LONG).show();
                } else if (error instanceof AuthFailureError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof ServerError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof NetworkError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof ParseError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());

                }
            }

        }, f, params);
        sr.setRetryPolicy(new DefaultRetryPolicy(100000*2,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        sr.setShouldCache(true);
        VolleySingleton.getInstance(getActivity()).addToRequestQueue(sr);


    } catch (Exception e) {
        e.printStackTrace();
    }
}
public类MultipartRequest扩展请求{
私有MultipartEntity=MultipartEntityBuilder.create();
私人最终回应。监听器;
私人最终文件;
私有最终HashMap参数;
公共多部分请求(字符串url、Response.Listener、Response.ErrorListener、文件文件、HashMap参数)
{
super(Method.POST、url、errorListener);
mListener=监听器;
this.file=文件;
this.params=params;
buildMultipartEntity();
buildMultipartEntity2();
}
私有void buildMultipartEntity()
{
entity.addBinaryBody(KEY_IMAGE,file,ContentType.create(“IMAGE/jpeg”),file.getName());
entity.setMode(HttpMultipartMode.BROWSER_兼容);
entity.setLaxMode().setBoundary(“xx”).setCharset(Charset.forName(“UTF-8”));
尝试
{
for(字符串键:params.keySet()){
entity.addPart(键,新的StringBody(参数get(键));
}
}
捕获(不支持的编码异常e)
{
截击日志(UnsupportedEncodingException);
}
}
@凌驾
公共字符串getBodyContentType()
{
返回实体.build().getContentType().getValue();
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map headers=super.getHeaders();
if(headers==null
||headers.equals(Collections.emptyMap()){
headers=newhashmap();
}
headers.put(“接受”、“应用程序/json”);
返回标题;
}
@凌驾
公共字节[]getBody()抛出AuthFailureError
{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
尝试
{
entity.build().writeTo(bos);
}
捕获(IOE异常)
{
e(“向ByteArrayOutputStream写入IOException”);
}
返回bos.toByteArray();
}
/**
*从Android StringRequest类复制
*/
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
字符串解析;
试一试{
parsed=新字符串(response.data,HttpHeaderParser.parseCharset(response.headers));
}捕获(不支持的编码异常e){
parsed=新字符串(response.data);
}
返回Response.success(已解析,HttpHeaderParser.parseCacheHeaders(Response));
}
@凌驾
受保护的void deliverResponse(字符串响应){
mListener.onResponse(response);
}}
此外,我们正在使用多部分请求,因为我们需要在这里上传一个文件(图像)。所以用这个代码把图片作为文件上传。现在进行StringRequest时,只需按如下方式进行多部分请求:

public class MultipartRequest extends Request<String> {
private MultipartEntityBuilder entity = MultipartEntityBuilder.create();
private final Response.Listener<String> mListener;
private final File file;
private final HashMap<String, String> params;

public MultipartRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, File file, HashMap<String, String> params)
{
    super(Method.POST, url, errorListener);

    mListener = listener;
    this.file = file;
    this.params = params;
    buildMultipartEntity();
    buildMultipartEntity2();

}



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

    try
    {
        for ( String key : params.keySet() ) {
            entity.addPart(key, new StringBody(params.get(key)));
        }
    }
    catch (UnsupportedEncodingException e)
    {
        VolleyLog.e("UnsupportedEncodingException");
    }
}

@Override
public String getBodyContentType()
{
    return entity.build().getContentType().getValue();
}
@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;
}

@Override
public byte[] getBody() throws AuthFailureError
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try
    {
        entity.build().writeTo(bos);
    }
    catch (IOException e)
    {
        VolleyLog.e("IOException writing to ByteArrayOutputStream");
    }
    return bos.toByteArray();
}
/**
 * copied from Android StringRequest class
 */
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
    String parsed;
    try {
        parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
    } catch (UnsupportedEncodingException e) {
        parsed = new String(response.data);
    }
    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}

@Override
protected void deliverResponse(String response) {
    mListener.onResponse(response);
}}
  public void uploadImage()
{
    try {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading...");
        pDialog.show();

           HashMap params = new HashMap<String, String>();

            params.put(KEY_NAME, name);
        MultipartRequest sr = new MultipartRequest( UPLOAD_URL, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                if ((pDialog != null) && pDialog.isShowing()) {
                    pDialog.dismiss();
                }
                Log.d("file", f + "");
                Log.d("", ".......response====" + response.toString());

                ////////
                try {
                    JSONObject object = new JSONObject(response);
                    String serverCode = object.getString("code");
                    if (serverCode.equalsIgnoreCase("0")) {

                    }
                    if (serverCode.equalsIgnoreCase("1")) {
                        try {

                            if ("1".equals(serverCode)) {
                                JSONObject object1 = object.getJSONObject("data");

                            }
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }


                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if ((pDialog != null) && pDialog.isShowing()) {
                    pDialog.dismiss();
                }
                ;
                //  VolleyLog.d("", "Error: " + error.getMessage());
                if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                    Toast.makeText(getActivity(), "Timeout Error",
                            Toast.LENGTH_LONG).show();
                } else if (error instanceof AuthFailureError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof ServerError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof NetworkError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());
                } else if (error instanceof ParseError) {
                    VolleyLog.d("", "" + error.getMessage() + "," + error.toString());

                }
            }

        }, f, params);
        sr.setRetryPolicy(new DefaultRetryPolicy(100000*2,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        sr.setShouldCache(true);
        VolleySingleton.getInstance(getActivity()).addToRequestQueue(sr);


    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void uploadImage()
{
试一试{
pDialog=newprogressdialog(getActivity());
设置消息(“加载…”);
pDialog.show();
HashMap params=新的HashMap();
参数put(键名称、名称);
MultipartRequest sr=新的MultipartRequest(UPLOAD\u URL,new Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
if((pDialog!=null)&&pDialog.isShowing(){
pDialog.disclose();
}
Log.d(“文件”,f+);
Log.d(“,”…response==“+response.toString());
////////
试一试{
JSONObject对象=新的JSONObject(响应);
字符串serverCode=object.getString(“代码”);
if(serverCode.equalsIgnoreCase(“0”)){
}
if(serverCode.equalsIgnoreCase(“1”)){
试一试{
如果(“1”。等于(服务器代码)){
JSONObject object1=object.getJSONObject(“数据”);
}
}
捕获(例外e){
e、 printStackTrace();
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
if((pDialog!=null)&&pDialog.isShowing(){
pDialog.disclose();
}
;
//VolleyLog.d(“,”错误:“+Error.getMessage());
if(TimeoutError的错误实例| | NoConnectionError的错误实例){
Toast.makeText(getActivity(),“超时错误”,
Toast.LENGTH_LONG).show();
}else if(AuthFailureError的错误实例){
VolleyLog.d(“,”+error.getMessage()+“,”+error.toString());
}else if(服务器错误实例){
VolleyLog.d(“,”+error.getMessage()+“,”+error.toString());
}else if(网络错误实例error){
VolleyLog.d(“,”+error.getMessage()+“,”+error.toString());
}else if(error instanceof ParseError){
VolleyLog.d(“,”+error.getMessage()+“,”+error.toString());
}
}
},f,params);
老。