安卓上传多图至PHP服务器教程分享 (android上传多张图片到php服务器)
随着移动互联网的发展,现在的手机越来越强大,不仅可以看视频、玩游戏,还可以进行图片上传等操作。在很多项目中,我们需要上传多张图片到服务器,因此,本文就来分享一下安卓上传多图至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.