- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我无法使用 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 库上传多个文件或图像的解决方案?
下面是一些关于 postman 使用 post 响应的图片
最佳答案
我创建了一个使用 PHP 上传两个以上图像的演示。请参阅下面的代码。
一步步走
第一步
1) Main Activity 有两个 ImageView
并从 drawable 文件夹中设置图像
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 步 list 文件
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>
第四步
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));
}
?>
关于android - 使用 Volley Library 在服务器上上传文件或图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41326223/
我目前正在测试 Volley 库。但是当请求失败 (404) 时,它不会再次执行,或者至少没有错误。但是缺少数据。如果请求失败,这是重试请求的正确方法吗? 提前致谢 req.setRetryPolic
我是新来从事Volley和缓存工作的:P。尽管我已经看过许多与Volley进行图像缓存有关的文章和帖子,但是我仍然不清楚采用Volley进行图像缓存的最佳/首选方式。像磁盘缓存还是内存? Volley
我想使用 Volley 从我的 Android 应用发送请求。 我已经把它包含在 build.gradle 中了 dependencies { ... compile 'com.andr
我的目标是从另一个类调用 Volley,这是一种非常简洁、模块化的方式,即: VolleyListener newListener = new VolleyListener()
我的代码是: class MyService extends Service{ public void onCreate(){ new ImageLoader(mReque
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我需要帮助来解决 Volley 库错误。我已使用 nodejs api 向服务器发送一些凭据以进行用户注册。在成功的情况下,当我的所有凭据对于创建新用户帐户都是唯一的时,它会向我显示所有响应等的所有内
我正在尝试完善我的应用程序中的错误处理,但我找不到 Volley 触发某些错误的集中位置以及原因。例如,我想知道如果我的请求的状态代码是 500 或更大,它肯定会触发 ServerError,但我似乎
当我在调试器中运行该方法时,数据按预期显示,但是每当我尝试使用它执行任何操作时,parentObject 的值都会返回为 null。 我只是想从服务器获取响应并将其存储为 JSONObject 以便在
我正在使用 Android Volley 缓存请求,这在我使用 GET 时工作正常,但由于某些原因我改用 POST。现在我想用不同的 POST 数据缓存相同的 URL。 请求 1 -> URL1,PO
我的情况是使用 Android-volley至 POST我的 json 对象,我可以成功发布所有内容,我的数据在服务器中可见,但服务器响应为 String不像 json ,这就是出现错误的原因。 co
我正在使用 volley 从 REST api 解析电影详细信息,并将解析的数据保存在名为 detailsMovies 的对象数组列表中。但是我无法在 onResponse 方法之外访问 ArrayL
我想知道如何解决这个问题。已完成代码的研究和替换,但问题仍然存在。 这是我使用 volley 的代码。 private void Regist(){ loading.setVisibility
如何创建一个单独的类,在其中定义所有关于 volley在另一个 Activity 中,我们直接传递 URL、CONTEXT 和 Get Response... 最佳答案 首先在Activity中创建回
我正在使用 volley 库并以 XML 格式获取响应。我想知道我们如何使用/volley 库解析响应。谢谢。 最佳答案 StringRequest req = new StringReque
当我在android studio中搜索 Volley 时,同时获取com.mcxiaoke.volley:library:1.0.19和com.mcxiaoke.volley:library-aar
我是 volley 和 android 的新手,我已经用 gradle 安装了 volley 并做了与官方教程相同的操作。但是没有响应,这意味着 Errorlistener 和 Responselis
当我在 Volley 中发出请求时,我收到 com.android.volley.ServerError 和响应代码 400。 我正在做这样的事情(通用示例代码): final String para
我引用了http://www.androidhive.info/2016/02/android-push-notifications-using-gcm-php-mysql-realtime-chat
当我将以下行添加到依赖项的 build.gradle 行时,Android Studio 显示此错误消息:compile 'com.android.volley:volley:1.0.0' apply
我是一名优秀的程序员,十分优秀!