安卓上传多图至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.


数据运维技术 » 安卓上传多图至PHP服务器教程分享 (android上传多张图片到php服务器)