android 打开系统相册得到路径 上传图片到php服务器
16lz
2021-01-22
最近在弄一个需要上传图片到服务器的项目(PHP -- warmserver),一些细节烦扰了我好久,终于解决了,所以也分享给大家。
读取相册需要一个读取sd卡的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>
首先是相册图片的获取:
private final String IMAGE_TYPE = "image/*";
//这里的IMAGE_CODE是自己任意定义的,主要用于标示你的activity的常量
private final int IMAGE_CODE = 0;
打开系统相册:
<span style="white-space:pre"></span>Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
<span style="white-space:pre"></span>
startActivityForResult(getAlbum, IMAGE_CODE);
//使用intent调用系统提供的相册功能,使用startActivityForResult是为了获取用户选择的图片
重写onActivityResult() : 刚方法里面的代码如下,
<span style="white-space:pre"></span>if (resultCode != RESULT_OK) { // 此处的 RESULT_OK 是系统自定义得一个常量
Log.e("TAG", "ActivityResult resultCode error");
return;
}
Bitmap bm = null;//定义一个空的Bitmap
// 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
ContentResolver resolver = getContentResolver();
// 此处的用于判断接收的Activity是不是你想要的那个
if (requestCode == IMAGE_CODE) {
try {
Uri originalUri = data.getData(); // 获得图片的uri
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); // 显得到bitmap图片
// 这里开始的第二部分,获取图片的路径:
String[] proj = { MediaStore.Images.Media.DATA };
// 好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = managedQuery(originalUri, proj, null, null,
null);
// 按我个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
// 最后根据索引值获取图片路径
String path = cursor.getString(column_index);
textView1.setText(path);//这里返回的路径我用一个textview输出显示在界面
} catch (IOException e) {
Log.e("Tag", e.toString());
}
}
获取到了图片的路径,下面就开始上传了,这里上传我用的是github上的开源框架(xUtils),可以去www.github.com 上搜索 xUtils ,看到人气高的就对了。直接给个下载地址 https://github.com/wyouflf/xUtils 下载完后把它拷到项目下就好了,有不懂的,里面还有说明书,中文的很简单。
下面就上传了,我刚才用一个textview显示了路径,直接拿textviewi里的文本就好了。你们也可以保存为一个变量也行。
这里我实现一个按钮点击事件直接上传
<span style="white-space:pre"></span>public static final String requestURL="http://119.29.170.185:8080/uploadImage/index.php";//上传服务器的url
<span style="white-space:pre"></span>public void upload(View view) {
RequestParams params = new RequestParams();
//判断textview是否为空,是否选择了图片。
if (TextUtils.isEmpty(textView1.getText().toString().trim())) {
Toast.makeText(getApplicationContext(), "没选择图片", 0).show();
return;
}//file为服务器接受要对应
params.addBodyParameter("file",new File(textView1.getText().toString().trim()));
HttpUtils http = new HttpUtils();//下面就直接调用框架的上传功能了,不需理解框架是怎么写的
http.send(HttpRequest.HttpMethod.POST,
requestURL,
params,
new RequestCallBack<String>() {//回调方法,成功和失败
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
Toast.makeText(getApplicationContext(), "上传成功", 0).show();
}
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(getApplicationContext(), "上传失败"+error.toString(), 0).show();
}
});
}
以上就是Android客户端的代码了,下面就是一个简单的php服务器的代码,很简单。
<?php
//获取文件后缀名函数(如:index.jpg 获取到的就是jpg)
function fileext($filename)
{
return substr(strrchr($filename, '.'), 1);
}
//生成随机文件名函数
function random($length)//length表示生成几个字符
{
$hash = 'image-';
// $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$chars = '0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i++)
{
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
/*echo "Upload: " . $_FILES["file"]["name"] . "<br />"; //获取上传文件的名字
echo "Type: " . $_FILES["file"]["type"] . "<br />"; //类型
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; //大小
echo "Stored in: " . $_FILES["file"]["tmp_name"];//临时文件路径 */
$uploaddir = './'.random(3).'.'.fileext($_FILES["file"]["name"]).'/';//设置文件保存目录 注意包含/
if(move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir)) //这个函数就是就图片从临时文件夹移动到自己的路径下面了
{
echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center>123</center>";
}
else {
echo"传输失败!";
}
}
?>
一个简单的文件上传就这样完成了。。。不懂没关系,重要的去寻找解决问题中的所获所得。
更多相关文章
- Android中如何有效的加载图片
- php 图片验证码用javascript验证
- Java图片识别技术原理-只取图片像素。。。
- 「小程序JAVA实战」小程序头像图片上传(中)(44)
- 错误:警告:无法从javaldx读取路径
- java项目中Classpath路径到底指的是哪里?
- 如何将树路径转换为json对象
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- 用JavaScript实现图片的自动浏览