获取权限

    <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. 带你深度解析Maven

    一.What`s Maven? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说 ...

  2. Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

    异常信息 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with na ...

  3. 一个Web前端自学者的自述

    想来想去还是写下这篇文章,先说明,我精通JAVA编程语言和web前端常见的技术,个人是做JAVA的多,但是更加喜欢前端.因为我从高一开始接触JAVA,家父是黑马的JAVA讲师,自己对编程很热爱,在大学 ...

  4. 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据

    § 封装网络请求及 mock 数据 本文配套视频地址: https://v.qq.com/x/page/i05544fogcm.html 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发 ...

  5. Ionic2 cordova angular2 打包到Android apk环境搭建

    一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...

  6. (一)初识mybatis

    Mybatis 是现在很多公司都选择使用的一个ORM(Object Relational Mapping)框架,所以是值得了解和学习一番的. MyBatis 是支持定制化 SQL.存储过程以及高级映射 ...

  7. scrapy框架第一章

    操作环境:python2.7+scrapy 安装比较简单,网上教程也超多,就不在此赘述. 示例网站:https://www.cnblogs.com/cate/python/ (爬去关于博客园所有pyt ...

  8. Spring基础篇——Spring容器和应用上下文理解

    上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...

  9. vue有关小知识

      截取链接参数: //截取链接参数 this.id = this.$route.query.id;

  10. 如何将外部的obj模型导入OpenGL

    1.关于obj的说明. obj中存放的是顶点坐标信息(v),面的信息(f),法线(vn),纹理坐标(vt),以及材质(这个放在mtl)中 我使用CINEMA 4D导出用VS查看后的信息: CINEMA ...