Android基础_一次上传多张图片
获取权限
<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基础_一次上传多张图片的更多相关文章
- [.ashx檔?泛型处理例程?]基础入门#2....FileUpload上传前,预览图片(两种作法--ashx与JavaScript)
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_02_fileupload_picture_p ...
- Android Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...
- Android Http实现文件的上传和下载
最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了 ...
- js_ajax模拟form表单提交_多文件上传_支持单个删除
需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...
- 微信JSSDK上传多张图片
之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...
- Okhttp3上传多张图片同时传递参数
之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片. 最近做项目,打算换个方法上传图片. Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片. ...
- thinkphp3.2+cropper上传多张图片剪切图片
实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...
- iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样
// 上传多张图片 - (void)send { // 设置初始记录量为0 self.count = 0; self.upcount = 0; // 设置初始值为NO self.isUploadPic ...
- php用jquery-ajax上传多张图片限制图片大小
php用jquery-ajax上传多张图片限制图片大小 /** * 上传图片,默认大小限制为3M * @param String $fileInputName * @param number $siz ...
随机推荐
- SDWebimage如何获取缓存大小以及清除缓存
sdwebimage如何获取缓存大小以及清除缓存 1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; ...
- Python3 将txt数据转换成列表,进行排序,筛选
Python 程序员需要知道的 30 个技巧 首先是数据: 将上边的四个数据分别写在新建的txt文件中 1.将txt数据转为列表 with open('james.txt') as jaf: data ...
- iOS wkwebview懒加载中遇到的问题
这是我遇到的问题,也许是个例,就算狗血了点吧 需求: 当前界面(mainVC)响应点击事件,传值给webviewController(webVC)其中包含网址,此时如果在webVC中对wkwebvie ...
- 关于博客中引用多媒体出现的bug说明
插件说明 Aplayer.Dplayer @DIYgod 大佬在gihub的开源项目,对此,表示非常之感谢!! Aplayer 支持放在页首 支持放在页尾 但是不支持直接放在文章中引用 解决方法: 1 ...
- 程序员的自我救赎---11.1:RPC接口使用规范
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- nova创建虚拟机源码分析系列之八 compute创建虚机
/conductor/api.py _build_instance() /conductor/rpcapi.py _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ...
- JavaScript连等赋值
最近探究js原理的过程中遇到了这个挺有趣的问题. 先贴代码: var a = {n:1} a.x = a = {n:2} alert(a.x) //undefined 在弄懂这个之前,我们先普及一个知 ...
- 1.sass的安装,编译,还有风格
1.安装sass 1.安装ruby 因为sass是用ruby语言写的,所以需要安装ruby环境 打开安装包去安装ruby,记住要勾选 下面选项来配置环境路径 [x] Add Ruby executab ...
- 6.Nginx作为负载均衡服务器应用
案例:Nginx作为负载均衡服务器应用 nginx的负载均衡功能是通过upstream命令实现的,因此他的负载均衡机制比较简单,是一个基于内容和应用的7层交换负载均衡的实现.Nginx负载均衡默认对后 ...
- find 命令的误差估值与单位调整
一.命令简介 find 命令的 -size 参数 单位b(不是byte而是block).c.w.k.M.G.默认是单位b ,也就是1block = 512byte = 0.5kb (文件系统ext4) ...