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

来源:互联网 发布:如何在淘宝里开网店 编辑:程序博客网 时间:2024/06/04 19:34

最近在弄一个需要上传图片到服务器的项目(PHP   --  warmserver),一些细节烦扰了我好久,终于解决了,所以也分享给大家。

读取相册需要一个读取sd卡的权限:

[html] view plain copy
print?
  1. <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;


打开系统相册:

[java] view plain copy
print?
  1. <span style="white-space:pre">        </span>Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);  
  2.   
  3.         getAlbum.setType(IMAGE_TYPE);  
  4. <span style="white-space:pre">        </span>  
  5.         startActivityForResult(getAlbum, IMAGE_CODE);  


//使用intent调用系统提供的相册功能,使用startActivityForResult是为了获取用户选择的图片

重写onActivityResult() : 刚方法里面的代码如下,

[java] view plain copy
print?
  1. <span style="white-space:pre">            </span>if (resultCode != RESULT_OK) { // 此处的 RESULT_OK 是系统自定义得一个常量  
  2.                 Log.e("TAG""ActivityResult resultCode error");  
  3.                 return;  
  4.             }  
  5.             Bitmap bm = null;//定义一个空的Bitmap  
  6.             // 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口  
  7.             ContentResolver resolver = getContentResolver();  
  8.             // 此处的用于判断接收的Activity是不是你想要的那个  
  9.             if (requestCode == IMAGE_CODE) {  
  10.                 try {  
  11.                     Uri originalUri = data.getData(); // 获得图片的uri  
  12.                     bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); // 显得到bitmap图片  
  13.                     // 这里开始的第二部分,获取图片的路径:  
  14.                     String[] proj = { MediaStore.Images.Media.DATA };  
  15.                     // 好像是android多媒体数据库的封装接口,具体的看Android文档  
  16.                     Cursor cursor = managedQuery(originalUri, proj, nullnull,  
  17.                             null);  
  18.                     // 按我个人理解 这个是获得用户选择的图片的索引值  
  19.                     int column_index = cursor  
  20.                             .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);  
  21.                     // 将光标移至开头 ,这个很重要,不小心很容易引起越界  
  22.                     cursor.moveToFirst();  
  23.                     // 最后根据索引值获取图片路径  
  24.                     String path = cursor.getString(column_index);  
  25.                     textView1.setText(path);//这里返回的路径我用一个textview输出显示在界面  
  26.                 } catch (IOException e) {  
  27.                     Log.e("Tag", e.toString());  
  28.                 }  
  29.             }  

获取到了图片的路径,下面就开始上传了,这里上传我用的是github上的开源框架(xUtils),可以去www.github.com 上搜索 xUtils ,看到人气高的就对了。直接给个下载地址 https://github.com/wyouflf/xUtils 下载完后把它拷到项目下就好了,有不懂的,里面还有说明书,中文的很简单。

下面就上传了,我刚才用一个textview显示了路径,直接拿textviewi里的文本就好了。你们也可以保存为一个变量也行。





这里我实现一个按钮点击事件直接上传

[java] view plain copy
print?
  1. <span style="white-space:pre">    </span>public static final String requestURL="http://119.29.170.185:8080/uploadImage/index.php";//上传服务器的url  

[java] view plain copy
print?
  1. <span style="white-space:pre">    </span>public void upload(View view) {  
  2.          RequestParams params = new RequestParams();  
  3.                 //判断textview是否为空,是否选择了图片。  
  4.          if (TextUtils.isEmpty(textView1.getText().toString().trim())) {  
  5.              Toast.makeText(getApplicationContext(), "没选择图片"0).show();  
  6.             return;  
  7.         }//file为服务器接受要对应       
  8.          params.addBodyParameter("file",new File(textView1.getText().toString().trim()));  
  9.          HttpUtils http = new HttpUtils();//下面就直接调用框架的上传功能了,不需理解框架是怎么写的  
  10.          http.send(HttpRequest.HttpMethod.POST,  
  11.                  requestURL,  
  12.              params,  
  13.              new RequestCallBack<String>() {//回调方法,成功和失败  
  14.                  @Override  
  15.                  public void onSuccess(ResponseInfo<String> responseInfo) {  
  16.                      Toast.makeText(getApplicationContext(), "上传成功"0).show();  
  17.                  }  
  18.                  @Override  
  19.                  public void onFailure(HttpException error, String msg) {  
  20.                      Toast.makeText(getApplicationContext(), "上传失败"+error.toString(), 0).show();  
  21.                  }  
  22.          });  
  23.     }  

以上就是Android客户端的代码了,下面就是一个简单的php服务器的代码,很简单。

[html] view plain copy
print?
  1. <?php   
  2.   
  3.    //获取文件后缀名函数(如:index.jpg   获取到的就是jpg)  
  4.      function fileext($filename)  
  5.     {  
  6.         return substr(strrchr($filename, '.'), 1);  
  7.     }  
  8.    //生成随机文件名函数    
  9.     function random($length)//length表示生成几个字符  
  10.     {  
  11.         $hash = 'image-';  
  12.       //  $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';  
  13.         $chars = '0123456789abcdefghijklmnopqrstuvwxyz';  
  14.         $max = strlen($chars) - 1;  
  15.         mt_srand((double)microtime() * 1000000);  
  16.             for($i = 0; $i < $length; $i++)  
  17.             {  
  18.                 $hash .= $chars[mt_rand(0, $max)];  
  19.             }  
  20.         return $hash;  
  21.     }    
  22.     if ($_FILES["file"]["error"] > 0)   
  23.     {   
  24.         echo "Error: " . $_FILES["file"]["error"] . "<br />";   
  25.     }   
  26.     else   
  27.     {   
  28.         /*echo "Upload: " . $_FILES["file"]["name"] . "<br />"; //获取上传文件的名字  
  29.         echo "Type: " . $_FILES["file"]["type"] . "<br />"; //类型  
  30.         echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; //大小  
  31.         echo "Stored in: " . $_FILES["file"]["tmp_name"];//临时文件路径 */  
  32.           
  33.          $uploaddir = './'.random(3).'.'.fileext($_FILES["file"]["name"]).'/';//设置文件保存目录 注意包含/  
  34.         if(move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir)) //这个函数就是就图片从临时文件夹移动到自己的路径下面了  
  35.         {   
  36.             echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center>123</center>";   
  37.         }  
  38.         else  {  
  39.              echo"传输失败!";   
  40.         }  
  41.     }   
  42. ?>  

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

0 0
原创粉丝点击