android 打开系统相册得到路径 上传图片到php服务器

来源:互联网 发布:淘宝店铺名字英文名字 编辑:程序博客网 时间:2024/06/05 02:20

最近在弄一个需要上传图片到服务器的项目(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(); // 获得图片的uribm = 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"传输失败!"; }} ?>

一个简单的文件上传就这样完成了。。。不懂没关系,重要的去寻找解决问题中的所获所得。

1 0