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

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

更多相关文章

  1. Android中如何有效的加载图片
  2. php 图片验证码用javascript验证
  3. Java图片识别技术原理-只取图片像素。。。
  4. 「小程序JAVA实战」小程序头像图片上传(中)(44)
  5. 错误:警告:无法从javaldx读取路径
  6. java项目中Classpath路径到底指的是哪里?
  7. 如何将树路径转换为json对象
  8. java操作ftp实现文件的上传下载(适用于图片文档服务器)
  9. 用JavaScript实现图片的自动浏览

随机推荐

  1. Android 手机震动 设置震动时间
  2. TabActivity的使用遇到的问题
  3. Android中使用TagFlowLayout制作动态添加
  4. Android(安卓)常用布局及基本UI控件
  5. Android 自定义标题栏Title Bar
  6. Android (一) Android studio 安装
  7. stagefright
  8. Android消息处理机制2——Message
  9. Android Tab切换表格头
  10. android 来电自动接听和自动挂断