简单的图片上传和下载
一.图片的上传
1.图片的来源无非是照相和图库的选择 将选择的图片进行封装到bean类中进行返回,之后通过上传的方式去上传
2.上传的方式也是两种方式,通过的字符串或者流的方式(先建立链接在通过流)
3.服务器返回的数据是上传成功与否的标识
4.使用框架进行上传。如:okhttp,xUtils,volley等等;
二.图片的下载
1.三级缓存()
2.第三方框架
更多的了解:http://blog.sina.com.cn/s/blog_9ac333de0101gptn.html
http://blog.csdn.net/u011240877/article/details/45824855
补充:
图片上传的方法:
直接从项目中copy的,可以参考这块的思路
在gridView上进行展示上传的个数
public class GridAdapter extends BaseAdapter {
private LayoutInflater inflater; // 视图容器
private int selectedPosition = -1;// 选中的位置
private boolean shape;
public boolean isShape() {
return shape;
}
public void setShape(boolean shape) {
this.shape = shape;
}
public GridAdapter(Context context) {
inflater = LayoutInflater.from(context);
}
// 从新加载并且上传新的多余的图片
public void update1() {
loading1();
}
public int getCount() {
return (Bimp.bmp.size() + 1);
}
public Object getItem(int arg0) {
return null;
}
public long getItemId(int arg0) {
return arg0;
}
public void setSelectedPosition(int position) {
selectedPosition = position;
}
public int getSelectedPosition() {
return selectedPosition;
}
/**
* ListView Item设置
*/
public View getView(int position, View convertView, ViewGroup parent) {
// final int coord = position;
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_published_grida,
parent, false);
holder = new ViewHolder();
holder.image = (ImageView) convertView
.findViewById(R.id.item_grida_image);
holder.customView = (CustomView6) convertView
.findViewById(R.id.customView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// customViewList.get(0).setVisibility(View.GONE);
holder.image.setVisibility(View.VISIBLE);
holder.customView.setProgress(0);
holder.customView.setVisibility(CustomView6.VISIBLE);
if (position == Bimp.bmp.size()) {
holder.image.setImageBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.icon_addpic_unfocused));
holder.customView.setVisibility(CustomView6.GONE);
} else {
holder.image.setImageBitmap(Bimp.bmp.get(position));
}
// 是否存在key(适用于拍照)
// 只要有选择照片的就会进来(包括第一次是选择照片)
if(Bimp.drr != null && Bimp.drr.size() > position){
if (Bimp.listtag != null && Bimp.listtag.size() > position) {
// 有上传成功的照片时会走
if (pictureTypeMap.containsKey(Bimp.drr.get(position).uuid)) {
if ("T".equals(pictureTypeMap.get(Bimp.drr.get(position).uuid))){
//角标越界
if (Bimp.listtag.size() > position) {
if (Bimp.listtag.get(position).equals(Bimp.drr.get(position).uuid)) {
holder.customView.setProgress(100);
}
}
}
}
}
}
if (position >= 9) {
holder.image.setVisibility(View.GONE);
cameraBtn.setVisibility(View.GONE);
if (Selected == 9) {
Toast.makeText(FieldInspecRegisterActivity.this,
"单次最大上传图片为9张", 0).show();
}
}
return convertView;
}
}
public class ViewHolder {
public ImageView image;
public CustomView6 customView;
}
//根据返回的集合的内容来展示图片
private void loading1() {
new Thread(new Runnable() {
public void run() {
while (true) {
if (Bimp.max == Bimp.drr.size()) {
Message message = new Message();
message.what = CHANGDATA;
handler.sendMessage(message);
break;
} else {
try {
String path = Bimp.drr.get(Bimp.max).path;
Bitmap bm = Bimp.revitionImageSize(path);
Bimp.bmp.add(bm);
String newStr = path.substring(
path.lastIndexOf("/") + 1,
path.lastIndexOf("."));
FileUtils.saveBitmap(bm, "" + newStr);
Bimp.max += 1;
Message message = new Message();
message.what = CHANGDATA;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
//监听物理返回键
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
if (Bimp.drr.size() > 0 && Selected < Bimp.drr.size()) {
//整在上传时进行对话框判断是否终止
showMyDialog();
} else {
if (attendance.getType().equals("back")) {
finish();
} else {
if (!(Bimp.drr.size() > Selected)) {
//上传的完成时
uploadPicStr();
}
}
}
}
return super.onKeyDown(keyCode, event);
}
//当界面返回时调用改方法,adapter适配
protected void onRestart() {
adapter2.update1();
super.onRestart();
}
// 界面销毁时,有数据需要清除
protected void onDestory() {
//广播注销
unregisterBroadcastReceiver();
if (Bimp.drr.size() > 0) {
Bimp.drr.clear();
}
if (Bimp.listtag.size() > 0) {
Bimp.listtag.clear();
}
if (Bimp.bmp.size() > 0) {
Bimp.bmp.clear();
}
FileUtils.deleteDir();
Bimp.max = 0;
Bimp.act_bool = false;
}
//
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 拍照
if (resultCode == RESULT_OK && (requestCode == PHOTO_GRAPH )) {
PhotoSelect++;
//拿到路径再次请求上传
if (picture.getAbsolutePath().length() > 0) {
//每次拿到给定图片的对象
UUID randomUUID = UUID.randomUUID();
BeanPicUpload mbeanPicUpload = new BeanPicUpload();
mbeanPicUpload.path=picture.getAbsolutePath();
mbeanPicUpload.uuid = randomUUID+"";
mbeanPicUpload.isSussecs=true;
Bimp.drr.add(mbeanPicUpload);
}
}
}
/**
* 上传图片
* 在生命止周期的方法去做
* 每次返回到当前的界面时就会执行上传的方法
* 这个方法在子线程中去完成,只要这个所有图片的 只有未成功上传的图片,该方法就在一直执行,直到到上传完成;
* */
@Override
protected void onResume() {
super.onResume();
if (isNetworkAvailable(FieldInspecRegisterActivity.this)) {
if(Bimp.drr.size()>0){
//每次进界面时都会重新调用
uploadThreadTest(Bimp.drr);
L.e(TAG, "wode 每次必须执行的方法 且这里面现在没有要执行的方法: "+Bimp.drr.toString());
}
} else {
Toast.makeText(FieldInspecRegisterActivity.this, "请检查网络",
Toast.LENGTH_SHORT).show();
}
}
/**
* 上传图片的方法
* @param mBeandrr
*/
private void uploadThreadTest(final List<BeanPicUpload> mListBeandrr) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < mListBeandrr.size(); i++) {
if(!Bimp.listtag.contains(mListBeandrr.get(i).uuid)){
upload(mListBeandrr.get(i));
L.e(TAG, "Bimp.listtag集合中的元素 "+Bimp.listtag.toString());
L.e(TAG, "要上传的数据"+mListBeandrr.get(i));
}
}
}
}).start();
}
private boolean isnextone =false ;
/**
* 在子线程中操作集合
*/
private void upload(BeanPicUpload beanPicUpload) {
//传递过来drr
String url_ = "http://cserverupload.cserver.cn/fileupload.do";
int res = -1;
String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
String PREFIX = "--";
String LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; // 内容类型
if (isNetworkAvailable(FieldInspecRegisterActivity.this)) {
if(Bimp.drr.size()>0){
//图片上传 已上传的就不要在上传(且开始时上传的集合是空)
//ture表示要上传的
L.e(TAG,"shenme 时候去执行了 :"+Bimp.listtag.size());
uploadPic(url_, BOUNDARY, PREFIX, LINE_END, CONTENT_TYPE,beanPicUpload);
}
} else {
Toast.makeText(FieldInspecRegisterActivity.this, "请检查网络", 0).show();
}
}
private void uploadPic(String url_, String BOUNDARY, String PREFIX,
String LINE_END, String CONTENT_TYPE,BeanPicUpload picbean) {
if(!isnextone){
isnextone=true;
Log.e(TAG, "传进来的数据 开始上传的数据 "+picbean.toString());
if((!picbean.path.equals(""))&&picbean.path!=null){
File perfile = new File(picbean.path);
int res = -1;
// 图片上传
if (perfile != null) {
HttpURLConnection conn;
URL url;
try {
url = new URL(url_);
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);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
L.e(TAG, "wode 数据输出流建立");
/**
* 当文件不为空时执行上传
* name里面的值为服务器端需要key
* 只有这个key 才可以得到对应的文件filename是文件的名字,包含后缀名
*
*/
StringBuffer sb = new StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
L.e(TAG, "wode shangchuan de wenjian 名称:"+perfile.getName());
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\""+ perfile.getName() + "\"" + LINE_END);
sb.append("Content-Type: application/octet-stream; charset="+ CHARSET + LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes());
InputStream is = new FileInputStream(perfile);
long total = perfile.length();
byte[] bytes = new byte[1024 * 10];
int len = 0;
int count = 0;
int progress = 0;
while ((len = is.read(bytes)) != -1) {
count += len;
progress = ((int) ((count / (float) total) * 100));
if (progress == 100) {
}
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=成功 当响应成功,获取响应的流
*/
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);
}
String result = sb1.toString();
JSONObject jsonObject;
jsonObject = new JSONObject(result);
uploadStr.append(jsonObject.optString("downloadUrl"));
uploadStr.append(",");
uploadNewStr.append(jsonObject.optString("newdownloadUrl"));
uploadNewStr.append(",");
//上传成功时进行保存
Selected++;// 成功的第几张图片
if (!pictureTypeMap.containsKey(picbean.uuid)) {
// 为什么在这打不到phototselect的值
pictureTypeMap.put(picbean.uuid, "T");// 选择的
L.e(TAG, "集合中保存了数据 :"+picbean.uuid+""+" "+"T");
}
// 使用bean类来记录所有的图片
Bimp.listtag.add(picbean.uuid);
// 这个发送消息的时候是关键
handler.sendEmptyMessage(UPLOADSUCCESS);
isnextone = false;
Log.e(TAG, "上传成功就会发送消息 Bimp.listtag 集合"+Bimp.listtag.toString());
Log.e(TAG, "上传成功就会发送消息 Bimp.drr 集合 "+Bimp.drr.toString());
} else if (res == 404) {
Toast.makeText(FieldInspecRegisterActivity.this, "网页找不到", 0)
.show();
} else if (res == 500) {
Toast.makeText(FieldInspecRegisterActivity.this, "服务器有问题",
0).show();
}
} catch (Exception e) {
Log.e(TAG, "异常 " + e.toString());
e.printStackTrace();
}
}
}
}
}
转载于:https://www.cnblogs.com/zyanrong/p/5486413.html
简单的图片上传和下载相关推荐
- alert()的功能_前端实现简单的图片上传小图预览功能
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- golang实现图片上传和下载
golang实现图片上传和下载,测试过可行.filename传对应图片的名字,图片内容传二进制,其键为uploadfile. package mainimport ("fmt"&q ...
- python自动上传图片_使用Python实现一个简单的图片上传存储服务
使用flask实现的一个简单的图片上传服务 设计初衷 对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛 自定义域名竟然需要域名备案(Excuse me,当初就是因为备 ...
- 用go来搭建一个简单的图片上传网站
提前说明一下:代码参考了<Go语言编程>,稍有变动, 自己亲自玩了一遍. 之前玩过go web server, 现在来用go来搭建一个简单的图片上传网站, 工作目录是:~/photoweb ...
- 微信企业号开发(七)---图片上传与下载
1.微信企业号图片上传与下载是微信企业号上传临时素材文件中一个小部门,微信企业号上传临时素材文件包括上传图片.语音.视频等媒体资源文件以及普通文件(如doc,ppt),接口返回媒体资源标识ID:med ...
- ASP.NET MVC实现简单的文件上传与下载
使用ASP.NET MVC实现简单的文件上传与下载. 1.上传文件HTML <form action='@Url.Action("Upload", "File&qu ...
- 用jsp实现简单的图片上传功能
用jsp实现简单的图片上传功能 1 先做一个页面,选择上传的图片 <body><form action="uploadServlet" enctype=" ...
- 用SpringMVC框架实现图片上传与下载
1.新建一个Maven webapp项目,引入需要用的夹包,pom.xml文件的依赖包如下: <dependencies><!-- 用于生成图片的缩略图 --><depe ...
- 一个.net6简单的图片上传(文件也可用)
#一个.net6简单的图片上传(文件也可用) ##页面 @{ViewData["Title"] = "图片上传Demo"; }<form asp-acti ...
最新文章
- javascript篇-知道value值,返回对象中的key值
- C语言学习之企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;
- 应用的生命周期各个程序运行状态时代理的回调
- VS Code 中有哪些好用的 Azure 插件?
- 大刚二开emlog模板超级帅-全版本兼容-修复各种bug
- 获得手机屏幕相关参数
- C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
- 宏碁4752G换CPU和显卡导热硅脂步骤
- ssm生鲜超市管理系统的设计与实现毕业设计源码261635
- 为什么说12306比淘宝双十一的技术挑战更大?
- 奥城大学计算机专业,美国提供研究生双录取的大学
- 梦三国解析服务器spl文件头失败解决,梦三国手游|深度解析“伪法师”张角:“不容忽视的战场杀器”...
- Win10 【TITAN Xp】和【TITAN RTX】-【TensorFlow】环境简单总结
- 京东联盟自动转链php,求京东联盟php自动转链源码 请 ZenHaBit 继续帮忙
- mac上配置cordova开发Android平台APP环境
- python中arcsec_Python SciPy 常数(Constants)
- 秒杀项目05-页面优化技术
- Matrix矩阵的基础案例与分析
- 什么是DNS域名解析?
- 曾经用过的“转正申请书”,给用得着的朋友参考