《android上传图片》

这是主函数
package com.zmb.updemo;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
 private Button mBtnUpload,whether;
 private ProgressBar mPgBar;
 private TextView mTvProgress;
 private Button choose;
 private ImageView imageView;
 private File file;
 private UpLoadTask upLoadTask;
 private static final int TIME_OUT = 120*10000000;   //超时时间
 private static final String CHARSET = "utf-8"; //设置编码
 private static final String RequestURL="http://192.168.0.164:9580/ekp/TestServlet";
 private AlertDialog dialog;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mBtnUpload = (Button)findViewById(R.id.uploadImage);
  choose = (Button)findViewById(R.id.selectImage);
  imageView=(ImageView) findViewById(R.id.imageView);
  mBtnUpload.setOnClickListener(this);
  choose.setOnClickListener(this);
  View upView = getLayoutInflater().inflate(R.layout.progress_bar_item, null);
  mPgBar = (ProgressBar)upView.findViewById(R.id.pb_filebrowser_uploading);
  mTvProgress = (TextView)upView.findViewById(R.id.tv_filebrowser_uploading);
  whether = (Button)upView.findViewById(R.id.upload_over);
  whether.setOnClickListener(this);
  dialog=new AlertDialog.Builder(MainActivity.this).setView(upView).create();
 }
 private class UpLoadTask extends AsyncTask<Void, Integer, String>{
  @Override
  protected void onPostExecute(String result) {
   mTvProgress.setText(result); 
   whether.setText("确定");
  }
  @Override
  protected void onPreExecute() {
   dialog.show();
   mTvProgress.setText("正在上传图片...");
   whether.setText("取消");
  }
  @Override
  protected void onProgressUpdate(Integer... values) {
   Integer num=values[0];
   mPgBar.setProgress(num);
   mTvProgress.setText("正在上传图片..." + num + "%");
  }
  @Override
  protected String doInBackground(Void...parem) {
   String  BOUNDARY =  UUID.randomUUID().toString();  //边界标识   随机生成
   String PREFIX = "--" , LINE_END = "\r\n"; 
   String CONTENT_TYPE = "multipart/form-data";   //内容类型
   
   try {
    URL url = new URL(RequestURL);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(TIME_OUT);
    conn.setConnectTimeout(TIME_OUT);
    conn.setDoInput(true);  //允许输入流
    conn.setDoOutput(true); //允许输出流
    conn.setUseCaches(false);  //不允许使用缓存
    conn.setRequestMethod("POST");  //请求方式
    conn.setRequestProperty("Charset", CHARSET);  //设置编码
    conn.setRequestProperty("connection", "keep-alive");   
    conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); 
    if(file!=null)
    {
     /**
      * 当文件不为空,把文件包装并且上传
      */
     OutputStream outputSteam=conn.getOutputStream();
     
     DataOutputStream dos = new DataOutputStream(outputSteam);
     StringBuffer sb = new StringBuffer();
     sb.append(PREFIX);
     sb.append(BOUNDARY);
     sb.append(LINE_END);
     /**
      * 这里重点注意:
      * name里面的值为服务器端需要key   只有这个key 才可以得到对应的文件
      * filename是文件的名字,包含后缀名的   比如:abc.png  
      */
     
     sb.append("Content-Disposition: form-data; name=\"img\"; filename=\""+file.getName()+"\""+LINE_END); 
     sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);
     sb.append(LINE_END);
     dos.write(sb.toString().getBytes());
    InputStream fis = new FileInputStream(file);
    long total = fis.available();
    String totalstr = String.valueOf(total);
    Log.d("文件大小", totalstr);
    byte[] buffer = new byte[8192]; // 8k
    int count = 0;
    int length = 0;
    while ((count = fis.read(buffer)) != -1) {
     dos.write(buffer, 0, count);
     length += count;
     publishProgress((int) ((length / (float) total) * 100));
     //为了演示进度,休眠50毫秒
     Thread.sleep(50);
    }   
    fis.close();
    dos.write(LINE_END.getBytes());
    byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
    dos.write(end_data);
    dos.flush();
    /**
     * 获取响应码  200=成功
     * 当响应成功,获取响应的流  
     */
    int res = conn.getResponseCode();  
    if(res==200)
    {
        return "上传成功!";
    }
   }
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return "上传失败!";
 }
}
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 @Override
 public void onClick(View v) {
  int id=v.getId();
  switch (id) {
  case R.id.selectImage:
   /***
    * 这个是调用android内置的intent,来过滤图片文件   ,同时也可以过滤其他的  
    */
   Intent intent = new Intent();
   intent.setType("image/*");
   intent.setAction(Intent.ACTION_GET_CONTENT);
   //回调图片类使用的
   startActivityForResult(intent, RESULT_CANCELED);
   break;
  case R.id.upload_over:
   if("确定".equals(whether.getText()+"")){
    dialog.dismiss();
   }else{
    upLoadTask.cancel(true);
    dialog.dismiss();
   }
   break;
  default:
  /* //这里的view是上传进度的弹框
   //AsyncTask的实例
   upLoadTask=new UpLoadTask();
   upLoadTask.execute();*/
    HttpClient client = new DefaultHttpClient();
          HttpGet get = new HttpGet("http://192.168.0.164:9580/ekp/TestServlet");
          try {
              HttpResponse response = client.execute(get);
              BufferedReader reader = new BufferedReader(new InputStreamReader(
                      response.getEntity().getContent()));
              for (String s = reader.readLine(); s != null; s = reader.readLine()) {
                 System.out.println("------------------??????");
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
   break;
  }
 }
 /**
  * 回调执行的方法
  */
 @SuppressWarnings("deprecation")
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode==Activity.RESULT_OK)
  {
   /**
    * 当选择的图片不为空的话,在获取到图片的途径  
    */
   Uri uri = data.getData();
   try {
    String[] pojo = {MediaStore.Images.Media.DATA};
    
    Cursor cursor = managedQuery(uri, pojo, null, null,null);
    if(cursor!=null)
    {
     ContentResolver cr = this.getContentResolver();
     int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
     cursor.moveToFirst();
     String path = cursor.getString(colunm_index);
     /***
      * 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,这样的话,我们判断文件的后缀名
      * 如果是图片格式的话,那么才可以   
      */
     if(path.endsWith("jpg")||path.endsWith("png"))
     {
      file=new File(path);
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
      imageView.setImageBitmap(bitmap);
     }
    }
    
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  
  /**
   * 回调使用
   */
  super.onActivityResult(requestCode, resultCode, data);
 }
 
}

主配置文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <Button  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="选择图片"
    android:id="@+id/selectImage"
    />
    <Button  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="上传图片"
    android:id="@+id/uploadImage"
    />
     <ImageView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView"
    />
</LinearLayout>

还有一个进度条的配置文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical" >
    <ProgressBar android:id="@+id/pb_filebrowser_uploading"
        style="?android:attr/progressBarStyleHorizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>
    
 <TextView android:id="@+id/tv_filebrowser_uploading"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>
 
 <Button android:id="@+id/upload_over"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>
</LinearLayout>

《android上传图片》,布布扣,bubuko.com

时间: 2024-10-06 05:37:38

《android上传图片》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: