使用Volley Library在服务器上上传文件或图像

时间:2016-12-26 03:42:15

标签: android android-volley

我无法使用Volley库在服务器上上传文件或多个图像。

以下是API的回复:

{
  "id": 1,
  "data": {
    "no": "1019",
    "status": "publish",
    "condition": Default,
    "quantity": 2,
    "category": "default",
    "images": [
      "http://demo/test1/wp-content/uploads/12/hello.jpg",
      "http://demo/test1/wp-content/uploads/12/Penguins-1.jpg",   
    ]
  }
}

有没有人有使用Volley库上传多个文件或图像的解决方案?

以下一些关于邮递员使用帖子的回复的图片

4 个答案:

答案 0 :(得分:3)

我创建了一个使用PHP上传两个以上图像的演示。请参阅下面的代码。

一步一步走

第1步

1)具有两个ImageView s的主要活动和来自可绘制文件夹的设置图像

2)更改网址

3)getStringImage()用于将Bitmap转换为String(您可以在日志中查看)

4)使用Volley库上传。

public class MainActivity extends AppCompatActivity {

    ImageView imageView1, imageView2;
    Button uploadImage;
    String URL = "http://192.168.1.85/DemoUploadTwoImage/post.php/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // XML Declaration
        imageView1 = (ImageView) findViewById(R.id.mimageView);
        imageView2 = (ImageView) findViewById(R.id.mimageView1);
        uploadImage = (Button) findViewById(R.id.mButton);

        // XML Set Images To ImageView

        imageView1.setImageResource(R.drawable.loading2);
        imageView2.setImageResource(R.drawable.loading1);


        uploadImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                UploadTwoImages();
            }
        });
    }

    public String getStringImage(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;
    }

    public void UploadTwoImages() {
        imageView1.buildDrawingCache();
        imageView2.buildDrawingCache();

        Bitmap bitmap1 = imageView1.getDrawingCache();
        Bitmap bitmap2 = imageView2.getDrawingCache();

        final String imageOne = getStringImage(bitmap1);
        final String imageTwo = getStringImage(bitmap2);

        Log.e("Image One", imageOne);
        Log.e("Image Twol", imageTwo);

        final ProgressDialog pDialog = new ProgressDialog(this);
        pDialog.setMessage("Registration is in Process Please wait...");
        pDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                URL,
                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {
                        pDialog.hide();
                        String result = response;
                        Log.e("Result", response);

                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Error", error.getMessage());
                pDialog.hide();

            }
        }) {

            @Override
            protected Map<String, String> getParams() {


                Map<String, String> params = new HashMap<String, String>();
                params.put("getdata", "UploadImage");


                params.put("insert_image_one", imageOne);
                params.put("insert_image_two", imageTwo);


                //Bank Information

                return params;
            }


        };

//Adding request to request queue
        VolleyAppController.getInstance().addToRequestQueue(stringRequest);

    }
}

第2步

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/mimageView"
        android:layout_width="150dp"

        android:layout_height="150dp"
        android:layout_gravity="center" />

    <ImageView
        android:id="@+id/mimageView1"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:layout_margin="10dp" />

    <Button
        android:id="@+id/mButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="UploadImage"
        android:textSize="20dp" />
</LinearLayout>

第3步 清单文件

1)专注于这一行:android:name=".VolleyAppController"

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jmtechnologies.uploadmultipleimagevolley">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".VolleyAppController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

第4步

1)添加VolleyAppController。这是Volley的类文件。

public class VolleyAppController extends Application {

    // this methode is for multidex install For Map and google Api


    public static final String TAG = VolleyAppController.class
            .getSimpleName();

    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;

    private static VolleyAppController mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized VolleyAppController getInstance() {
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }

        return mRequestQueue;
    }

    public ImageLoader getImageLoader() {
        getRequestQueue();
        if (mImageLoader == null) {
            mImageLoader = new ImageLoader(this.mRequestQueue,
                    new LruBitmapCache());
        }
        return this.mImageLoader;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        // set the default tag if tag is empty
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }

    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

第5步

1)添加LruBitmapCache类文件。 2)不是强制性的。

public class LruBitmapCache extends LruCache<String, Bitmap> implements
                ImageLoader.ImageCache {
            public static int getDefaultLruCacheSize() {
                final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
                final int cacheSize = maxMemory / 8;

                return cacheSize;
            }

            public LruBitmapCache() {
                this(getDefaultLruCacheSize());
            }

            public LruBitmapCache(int sizeInKiloBytes) {
                super(sizeInKiloBytes);
            }

            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight() / 1024;
            }

            @Override
            public Bitmap getBitmap(String url) {
                return get(url);
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                put(url, bitmap);
            }
        }

7)服务器端文件db_connect.php

<?php
 define('HOST','localhost');
 define('USER','root');
 define('PASS','Root@123');
 define('DB','uploadTwoImages');

 $con = mysqli_connect(HOST,USER,PASS,DB) or die('Unable to Connect');
 ?>

8)服务器端文件post.php

<?php

include 'db_connect.php';
$datetime = date('d/m/Y');
$request=$_REQUEST['getdata'];

 // customer Registration form
if($request=="UploadImage")
        {
        //mysqli_set_charset( $con, 'utf8');

        $image1 =$_REQUEST['insert_image_one'];

        $image2 =$_REQUEST['insert_image_two'];
        $imageName1="image1.jpg";
        $imageName2="image2.jpg";



            $Image1_path = "Uploads/$imageName1";
            $Image2_path = "Uploads/$imageName2";

            $actualpath = "http://192.168.1.85/DemoUploadTwoImage/$Image1_path";
            $actualpath1 = "http://192.168.1.85/DemoUploadTwoImage/$Image2_path";


                $m=mysqli_query($con,"INSERT INTO `UserImage`(`imageOne`, `imageTwo`) VALUES ('$actualpath','$actualpath1')");   

                if($m)
                {
                    file_put_contents($Image1_path,base64_decode($image1));
                    file_put_contents($Image2_path,base64_decode($image2));
                  $flag['Code']='Data Inserted';
                }
        print(json_encode($flag));    
        }
else
{

    $flag['Error']='2';
    print(json_encode($flag));      

}       
?>

<强> 9) Input Android

<强> 10) Output File on local server

答案 1 :(得分:0)

试试这个:

private void UploadImage(String url) {
    VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() {
        @Override
        public void onResponse(NetworkResponse response) {

            String sStatus = "";
            Log.e("registr", resultResponse);
            try {
                   String Sstatus = "", Smessage = "";
                try {

                    JSONObject object = new JSONObject(resultResponse);
                    Smessage = object.getString("message");

                    if (Sstatus.equalsIgnoreCase("1")) {

                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                if (Sstatus.equalsIgnoreCase("1")) {

                    } else {

                    }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            dialog.dismiss();
            NetworkResponse networkResponse = error.networkResponse;
            String errorMessage = "Unknown error";
            if (networkResponse == null) {
                if (error.getClass().equals(TimeoutError.class)) {
                    errorMessage = "Request timeout";
                } else if (error.getClass().equals(NoConnectionError.class)) {
                    errorMessage = "Failed to connect server";
                }
            } else {
                String result = new String(networkResponse.data);
                try {
                    JSONObject response = new JSONObject(result);
                    String status = response.getString("status");
                    String message = response.getString("message");
                    Log.e("Error Status", status);
                    Log.e("Error Message", message);
                    if (networkResponse.statusCode == 404) {
                        errorMessage = "Resource not found";
                    } else if (networkResponse.statusCode == 401) {
                        errorMessage = message + " Please login again";
                    } else if (networkResponse.statusCode == 400) {
                        errorMessage = message + " Check your inputs";
                    } else if (networkResponse.statusCode == 500) {
                        errorMessage = message + " Something is getting wrong";
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            Log.i("Error", errorMessage);
            error.printStackTrace();
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {

            Map<String, String> headers = new HashMap<String, String>();

            return headers;
        }

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> jsonParams = new HashMap<>();
                jsonParams.put("key", "value");
                 return jsonParams;
        }

        @Override
        protected Map<String, DataPart> getByteData() {
            Map<String, DataPart> params = new HashMap<>();


            if (byteArray != null) {
                if (extension.equalsIgnoreCase("jpg")) {
                //Important convert your image into byte Array
                    params.put("image", new DataPart("image.jpg", byteArray));
                }
            }

            return params;
        }
    };

}

答案 2 :(得分:0)

请看这里:Online chat Application in Android using GCM,PHP,Volley... 聊天应用程序的例子包含使用Volley的图像上传模块 我希望它有所帮助:)

答案 3 :(得分:0)

我建议您在上传之前添加此代码以调整图片大小。我希望它对您的代码有用

protected void selectImage() {

            final CharSequence[] options = {"Choose from Gallery", "Cancel"};
            AlertDialog.Builder builder = new AlertDialog.Builder(YOUR_ACTIVITY.this);
            builder.setTitle("Add Photo!");

            builder.setItems(options, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (options[item].equals("Choose from Gallery"))
                    {
                        intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                        intent.putExtra("crop", "true");
                        intent.putExtra("aspectX", 0);
                        intent.putExtra("aspectY", 0);
                        intent.putExtra("outputX", 200);
                        intent.putExtra("outputY", 200);

                      startActivityForResult(intent, 1);

                    }
                    else if (options[item].equals("Cancel")) {
                        dialog.dismiss();
                    }
                }
            });
            builder.show();
            }