使用Volley Library在服务器上上传文件或图像
问题描述:
我无法使用Volley库在服务器上上传文件或多个图像。使用Volley Library在服务器上上传文件或图像
下面是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",
]
}
}
是否有人在使用上传凌空库中的多个文件或图像的解决方案?
下面使用后
答
试试这个关于邮递员响应某些图像:
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;
}
};
}
+0
什么是'VolleyMultipartRequest'?它不在排球库中 – Redman
答
我创建了一个演示使用PHP上传两个以上的图像。见下面的代码。
一步一步
步骤1
1)具有两个ImageView
的主导活性,并设置图像从可绘制文件夹
2)改变URL
使用3)使用getStringImage()
将位图转换为字符串(您可以在日志中查看)
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','[email protected]');
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));
}
?>
在这里
答
我建议你将此代码添加到在上传之前调整图片大小。我希望它对你的代码有用
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();
}
我不会推荐使用凌云库来上传文件。当需要传输大型数据(如文件)时,Volley的性能会受到影响。您可以使用OkHTTP库通过多部分文件上传在服务器上上传文件。相信我,比凌空更快,更轻松,更高效。 – oathkeeper
想要发布图片或从服务器下载 – YUVRAJ
multipart/form-data http://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with- volley – rahul