ut.activity_main); button1 = findViewById(R.id.test); button2 = findViewById(R.id.test2); imageView = findViewById(R.id.image); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectImage(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { uploadImage(); } }); }
private void selectImage() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 1); }
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK) { Uri uri = data.getData(); String path = getRealPathFromURI(uri); Bitmap bitmap = BitmapFactory.decodeFile(path); Message message = handler.obtainMessage(); message.obj = bitmap; handler.sendMessage(message); } }
private String getRealPathFromURI(Uri contentUri) { Cursor cursor = getContentResolver().query(contentUri, null, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } return null; }
private void uploadImage() { final String filePath = getRealPathFromURI(imageView.getDrawable().toBitmap()); File file = new File(filePath); RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build();
Request request = new Request.Builder() .url("http://your_server_url/upload.php") .post(body) .build();
client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e("Upload Error", e.getMessage()); }
@Override public void onResponse(Call call, Response response) throws IOException { if (!response.isSuccessful()) { Log.e("Upload Status", "Error: " + response.code()); } else { Log.i("Upload Status", "Success"); } } });
}
}
这段代码展示了如何在Android应用中实现图片上传至PHP服务器的功能。我们看到布局文件`activity_main.xml`,它包含两个按钮(button1和button2)以及一个ImageView。button1用于选择图片,button2用于上传图片。
在`MainActivity`中,我们为这两个按钮设置了点击事件监听器。当用户点击button1时,调用`selectImage()`方法,启动一个Intent来让用户从相册中选择图片。选择图片后,`onActivityResult()`会返回所选图片的URI,我们将其转换为实际路径,并加载到ImageView中。
当用户点击button2时,调用`uploadImage()`方法。这个方法首先获取ImageView中的图片路径,然后创建一个RequestBody对象,用于封装图片文件。接着,创建一个MultipartBody.Part对象,这是HTTP请求中用于上传多部分数据的格式。在这里,我们将图片作为表单字段"image"上传。
接下来,我们创建一个OkHttpClient实例,设置超时时间。然后构建一个POST请求,指定服务器的URL和上传的图片数据。通过OkHttpClient的enqueue方法异步发送请求。在回调中,我们处理上传响应,如果请求成功,会在日志中打印“Success”。
在PHP服务器端,你需要一个名为`upload.php`的脚本来接收并处理上传的图片。这个脚本通常会保存图片到服务器的某个目录,并可能对上传的文件进行验证,例如检查文件类型、大小等。不过,这部分代码没有给出,需要你自己根据实际需求编写。
总结一下,这个实例代码涵盖了以下几个关键知识点:
1. 使用Intent选择图片:通过ACTION_GET_CONTENT启动系统相册。
2. 获取图片的实际路径:`getRealPathFromURI()`方法。
3. 使用OkHttp进行网络请求:创建OkHttpClient实例,设置超时,构建Request和RequestBody。
4. 多部分上传:利用MultipartBody.Part上传图片文件。
5. 异步请求处理:通过OkHttp的enqueue方法发送非阻塞请求,使用Callback处理结果。
以上就是Android应用中将图片上传到PHP服务器的具体步骤和相关技术点。需要注意的是,实际应用中还需要处理各种异常情况,如网络连接失败、服务器返回错误等。此外,为了用户隐私和安全,应尽量避免在代码中硬编码服务器URL,而是将其存储在配置文件或使用环境变量。