在webview中选择图片一般是设置WebChromeClient,然后重写openFileChooser方法,最后在onActivityResult中得到图片Uri
问题来了,这个Uri一般都没有文件后缀(.jpg.png),像下面这样
filecontent://media/external/images/media/68987
将图片上传到服务器后,保存在服务器的文件名字就是68987了,文件没有后缀,将后缀改为.jpg之后,图片是正确的,,,
遇到这个问题排查了一天
解决方式
根据 Uri 获取文件的真实路径, 然后再把真实路径转成 Uri. 这时候的 Uri 就是带文件真实名和后缀的.
// 根据 Uri 获取文件真实路径的代码:
https://gist.github.com/atearsan/1f0846e6dcdb3d8f3d1d
// 真实路径转成 Uri 的代码: Uri.fromFile(new File(filePath));
// Uri 打印结果: file:///storage/emulated/0/DCIM/Camera/IMG_20151006_193049.jpg
// 根据 Uri 获取文件真实路径的代码
package com.atearsan.util;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
// Code taken from: http://stackoverflow.com/questions/20067508/get-real-path-from-uri-android-kitkat-new-storage-access-framework
public class MediaUtility {
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {