获取权限

    <uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

页面布局视图:

效果是:点击图片1:拍照上传,1张或多张。

点击图片2:从相册中选择照片上传

Activity核心代码:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout; import com.example.utils.BitMapUtils;
import com.example.utils.FileUtils; import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID; public class UpLoadActivity extends Activity implements View.OnClickListener{ private ImageView image1,image2;
private GridLayout showImagePanal;
private EditText inMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_up_load);
image1=(ImageView)findViewById(R.id.imageOne);
image2=(ImageView)findViewById(R.id.imageTwo);
showImagePanal=(GridLayout)findViewById(R.id.showImagePanal);
inMessage=(EditText)findViewById(R.id.userMessage); image1.setOnClickListener(this);
image2.setOnClickListener(this);
}
//点击图像,选择图片
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageOne:
Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent1, 0);
break;
case R.id.imageTwo:
Intent intent2=new Intent();
intent2.setAction(Intent.ACTION_GET_CONTENT);
intent2.setType("image/*");
startActivityForResult(intent2, 1);
break;
default:
break;
}
} private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
//记录已经拍摄或者选择的图像集
private List images=new ArrayList();
//接收返回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
switch (requestCode) {
case 0:
Bundle bundle = data.getExtras();//获取相机拍照后返回值
Bitmap bitmap = (Bitmap) bundle.get("data");//获取拍照图像
String fileName = "IMG_" + sdf.format(new Date()) + ".jpg";
String path = getApplicationContext().getCacheDir()
.getAbsolutePath() + "/images/" + fileName;
FileOutputStream b = null;
File file = new File(path);
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();// 创建文件夹
try {
b = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, b);
b.flush();
b.close();
} catch (Exception e) {
e.printStackTrace();
}
Log.i("-------------", "path:" + path);
images.add(path);//记录文件路径
//bitmap = BitMapUtils.getSmallBitmap(path);
//image1.setImageBitmap(bitmap);
break;
case 1:
Uri uri = data.getData();//获取选择的图片Uri
String path2 = FileUtils.getPath(this, uri);//获取图片真实保存位置
images.add(path2);//记录文件路径
//Bitmap bitmap2 = BitMapUtils.getSmallBitmap(path2);//获取压缩图像
//image2.setImageBitmap(bitmap2);
break;
default:
break;
}
}
if(requestCode==1 || requestCode==0){
ImageView image=new ImageView(this);
image.setId(images.size()+1);
image.setLayoutParams(new LinearLayout.LayoutParams(80, 80));
Bitmap bitmap = BitMapUtils.getSmallBitmap(images.get(images.size()-1)+"");//获取压缩图像
image.setImageBitmap(bitmap);
showImagePanal.addView(image);
}
} //发布
HttpURLConnection conn=null;
public void doSend(View view){
Log.i("-------------", "--------start---------");
new Thread(new Runnable() {
public void run() {
String msg = inMessage.getText().toString();
String path="Http://10.0.2.2:8080/Web_Project/UploadImageServlet?inputMessage="+msg;
try {
URL url = new URL(path);
String result = null;
String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成;
String PREFIX = "--", LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; // 内容类型
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setReadTimeout(25000);
conn.setConnectTimeout(5000);
conn.setDoInput(true); // 允许输入流
conn.setDoOutput(true); // 允许输出流
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST"); // 请求方式
conn.setRequestProperty("Charset", "UTF-8"); // 设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE
+ ";boundary=" + BOUNDARY); if (images != null&&images.size()>0) {
DataOutputStream dos = new DataOutputStream(conn
.getOutputStream()); for (int i = 0; i < images.size(); i++) {
File file=new File(images.get(i).toString());
Log.i("--------------------", "file"+i+"="+file.getName());
/**
* 当文件不为空,把文件包装并且上传
*/
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=\"uimages\"; filename=\""
+ file.getName() + "\"" + LINE_END);
sb.append("Content-Type: application/octet-stream; charset=UTF-8"
+ LINE_END);
sb.append(LINE_END);
Log.i("------------", "--Header--"+sb.toString());
dos.write(sb.toString().getBytes());
InputStream is = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
}
is.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) { InputStream input = conn.getInputStream();
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = input.read()) != -1) {
sb1.append((char) ss);
}
result = sb1.toString();
Log.i("--------------", "result : " + result);
} }
Log.i("-------------", "--------responseCode:---------"
+ conn.getResponseCode()); Log.i("-------------", "--------end---------");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null)
conn.disconnect();
}
}
}).start();
}
}

最终效果图:

Android基础_一次上传多张图片的更多相关文章

  1. [.ashx檔?泛型处理例程?]基础入门#2....FileUpload上传前,预览图片(两种作法--ashx与JavaScript)

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_02_fileupload_picture_p ...

  2. Android Retrofit 2.0文件上传

    Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...

  3. Android Http实现文件的上传和下载

    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了 ...

  4. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  5. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

  6. Okhttp3上传多张图片同时传递参数

    之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片. 最近做项目,打算换个方法上传图片. Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片. ...

  7. thinkphp3.2+cropper上传多张图片剪切图片

    实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...

  8. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样

    // 上传多张图片 - (void)send { // 设置初始记录量为0 self.count = 0; self.upcount = 0; // 设置初始值为NO self.isUploadPic ...

  9. php用jquery-ajax上传多张图片限制图片大小

    php用jquery-ajax上传多张图片限制图片大小 /** * 上传图片,默认大小限制为3M * @param String $fileInputName * @param number $siz ...

随机推荐

  1. Natas Wargame Level25 Writeup(头部注入+POST/GET注入)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArsAAAC8CAYAAAB4+WYTAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  2. 工作随笔——ember框架去除url上的#号

    因为工作原因,接触到了一套非常好的前端框架--ember. ember框架高度封装,学习曲线比较陡峭. ember对于url更新的配置在config/environment.js >> l ...

  3. 理解Vue中的Render渲染函数

    理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...

  4. JS获取字符对应的ASCII码

    有时候会需要用到字符的ASCII码,一时之间调试时可能会忘记字符与ASCII码对应的数字. 最近喜欢用浏览器控制台直接跑JS代码,将这个代码直接贴到浏览器控制台,即可调试(谷歌浏览器快捷键 ctrl+ ...

  5. 那些容易遗忘的web前端问题

    背景: 年底将至,本人这只才出门的前端菜鸟,终于有空闲的时间来整理一下最近投简历时出现的问题.有的是经常使用但是没有仔细留意造成的:有的是个人认为根本没人使用而忽略的.为了下次不出现这种错误,进行一下 ...

  6. mentohust 使用

    可使用帮助命令 mentohust -h 或着查看 https://wenku.baidu.com/view/95c08019ff00bed5b9f31d1a.html

  7. ArcGIS 网络分析[8.4] 资料4 聚合——创建及打开网络数据集的类实现

    这篇是对前三篇的总结,因为网络数据集涉及的"点"太多了,我只能挑重点来设置,大家明白框架后可以自行寻求帮助文档添加功能. 我以C#类的形式给出,这个类包含很多种方法,因为本人的C# ...

  8. Linux服务器上的oracle数据导入和导出

    背景: 在同一台Linux服务器上,有两个数据库用户,分别为:database1,database2,如何把database1用户下面的所有的表和数据,导入到database2数据库(database ...

  9. 网络实时流量监控工具iftop---转

    网络实时流量监控工具iftop 分类: LINUX 1.安装依赖软件库 [root@localhost ~]# yum install libpcap libpcap-devel ncurses nc ...

  10. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...