随着移动互联网的发展,现在的手机越来越强大,不仅可以看视频、玩游戏,还可以进行图片上传等操作。在很多项目中,我们需要上传多张图片到服务器,因此,本文就来分享一下安卓上传多图至PHP服务器的实现方法。
1. 准备工作
我们需要在服务器上搭建一个PHP服务端,用于接收安卓端发送的多张图片。我们可以使用LAMP或者XAMPP等工具来搭建一个本地服务器进行测试,也可以购买云服务器进行部署。
在安卓端,我们需要准备好以下两个类库:
(1)okhttp:是一个网络请求库,可以帮助我们快速发送HTTP请求,并且支持文件上传、流式上传等操作。
(2)Matisse:一个高度可定制的多媒体选择器,支持图片、视频等多种媒体选择,具有强大的图片处理功能。
2. 实现步骤
在安卓端,我们需要先通过Matisse选择多张图片,然后将它们转换成文件流,最后使用okhttp将文件流上传至PHP服务器。
(1)使用Matisse库选择图片
Matisse库比系统的图片选择器更加高效和美观,我们可以引入依赖,然后在activity中使用下面的代码选择图片:
“`java
private static final int REQUEST_CODE_CHOOSE = 23;
Matisse.from(MnActivity.this)
.choose(MimeType.ofAll()) // 选择全部类型的媒体
.countable(true) // 显示多选个数
.maxSelectable(9) // 最多选择9张
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRT)
.thumbnlScale(0.85f)
.imageEngine(new GlideEngine()) // 使用Glide引擎加载图片
.forResult(REQUEST_CODE_CHOOSE); // 设置请求码
“`
(2)将文件流转换成RequestBody
选择图片后,我们需要将它们转换成文件流,然后使用okhttp发送HTTP请求,可以通过下面的方法将文件流转换成RequestBody:
“`java
/**
* 将inputStream转换成RequestBody
*
* @param inputStream 文件流
* @param fileName 文件名
*
* @return RequestBody
*/
public static RequestBody createRequestBody(InputStream inputStream, String fileName) {
// 将输入流转换为字节数组输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[BUFFER_SIZE];
try {
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
// 将字节数组输出流转换为RequestBody
return RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), outputStream.toByteArray());
}
“`
(3)使用okhttp上传文件流
将文件流转换成RequestBody后,我们就可以使用okhttp发送HTTP请求将文件上传至服务器了。下面是一个示例代码,可以将多个文件上传至服务器:
“`java
private static final String UPLOAD_URL = “http://yourserver.com/upload.php”;
private void uploadImages(List uriList) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for (Uri uri : uriList) {
InputStream inputStream;
try {
inputStream = getContentResolver().openInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
continue;
}
String fileName = getImagePath(uri);
RequestBody fileBody = createRequestBody(inputStream, fileName);
builder.addFormDataPart(“file[]”, fileName, fileBody); // 将RequestBody添加到Builder中
}
RequestBody requestBody = builder.build(); // 构建RequestBody
Request request = new Request.Builder().url(UPLOAD_URL).post(requestBody).build(); // 发送POST请求
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
okHttpClient.newCall(request).enqueue(new Callback() { // 异步发送请求
@Override
public void onFlure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG, “uploadImages response=” + response.body().string());
}
});
}
private String getImagePath(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(this, uri, projection, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else {
return uri.getPath();
}
}
“`
3.
相关问题拓展阅读:
- Android图片批量上传的功能。(图片比较大)
Android图片批量上传的功能。(图片比较大)
首先,以下架构下的批量文件上传可能会失败或者不会成功:
.android客户端+springMVC服务端:服务端采用org.springframework.web.multipart.MultipartHttpServletRequest作为批量上传接收类,这种搭配下的批量文件上传会失败,最终服务端只会接受到一个文件,即陪雀祥只会接受到之一个文件。可能因为MultipartHttpServletRequest对servlet原本的HttpServletRequest类进行封装,芦搏导致批量上传有问题。
.android客户端+strutsMVC服务端:这种搭配下的多文件上传,本人没有亲自尝试,不做评论。如果有网友岁樱采用此种方式上传失败的,原因可能同1。
Android中上传图片或者并山滚下载图片,使用最多的是xUtils和imageloader、glide,选用这两种的哪一种框架都行,因为是批量和图片大容易造成界面卡以及上传速度慢,对图片操作不当就容易造成OOM异常,一般对于批量上传大图片都需要对图片也处理,然后在上传绝余之一步需要对图片进行比例压缩之后再进行质量压缩,处理之后的唯清图片比之前的图片会小很多,再加上框架的上传处理,会有很好的效果,希望对你有所帮助
当然是使用FTP,异步上传了
android上传多张图片到php服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于android上传多张图片到php服务器,安卓上传多图至PHP服务器教程分享,Android图片批量上传的功能。(图片比较大)的信息别忘了在本站进行查找喔。