Okhttp上传图片方法,就像网页那样,使用Form的Post。

首先创建requestBody,然后Builder构建Query:最后Response返回服务器请求,最后把response.body().string()转换成String格式,

不算很难,不详解。

    // 上傳圖片
private String uploadResult;
public String uploadImage(String URL, String userId, File file, String fileName) {
try {
// MultipartBuilder,是上传文件的query
// addFormDataPart方法:@param [String]name, [String]value
// addFormDataPart方法:@param [String]name, [String]fileName, [String]fileType, [String]file
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("portrait", fileName,
RequestBody.create(MediaType.parse("image/jpg"), file))
.addFormDataPart("userId", userId)
.addFormDataPart("action", "updateProtrait")
.build(); // request方法: @param [String]URL, [RequestBody]requestBody
Request request = new Request.Builder()
.url(URL)
.post(requestBody)
.build(); // response储存服务器的回应
Response response = okHttpClient.newCall(request).execute();
// 把response转换成string
uploadResult = response.body().string(); } catch (IOException e) {
uploadResult = e.toString();
}
return uploadResult;
}

2. 这里是调用OkHttp上传照片方法,叁数是File类型。里面还有其他逻辑,自己叁透一下。

    private String updatePortraitURL;
private UserDTO userDTO;
private ResultDTO resultDTO;
private String userId;
private String userName;
private String updatePortraitResult;
private File filePortrait;
private void updatePortrait() {
// Network thread
new Thread(new Runnable() {
@Override
public void run() { // get update protrait URL
updatePortraitURL = Configuration.updatePortrait;
// get user id
userDTO = userDAO.getUser();
userId = Integer.toString(userDTO.getId());
userName = userDTO.getName();
// convert bitmap to file
filePortrait = convertBitmapToFile(protrait);
// update via network
updatePortraitResult = okhttp.uploadImage(updatePortraitURL, userId,filePortrait,userName);
// gson
resultDTO = gsonTools.getResult(updatePortraitResult); // UI Thread
UploadPortraitActivity.this.runOnUiThread(new Runnable() {
public void run() {
// you can output to see the response from backend
// tvUploadPortrait.setText(resultDTO.toString()); if ( (resultDTO.getResult()).equals(1) )
{
tvUploadPortrait.setText("上傳照片成功。");
} else {
tvUploadPortrait.setText("上傳照片失敗。");
}
UploadPortraitActivity.this.finish();
}
}); }
}).start();
}

3. 这里有一个很重要的方法,把BitMap转换成File,那OkHttp才能构成requestBody。

    // convert bitmap to file
private File f;
private File convertBitmapToFile(Bitmap bitmap) {
try {
// create a file to write bitmap data
f = new File(UploadPortraitActivity.this.getCacheDir(), "portrait");
f.createNewFile(); // convert bitmap to byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray(); // write the bytes in file
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();
} catch (Exception e) { }
return f;
}

4. 还有就是提权,能获取手机SD卡的相片。

首先,IsHavingPermissionStorage是先允许应用能存取手机内的数据。

然后,getImageFromGalery里的startActivityForResult(intent, RESULT_LOAD_IMAGE)是从相册中选择照片,最后调用onActivityResult。

这里不复杂,不详述,自己叁透一下。

    // check Permission
private void IsHavingPermissionStorage() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// you can output the permission state
// tvUploadPortrait.setText("能存取內置記憶體資料!");
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission. READ_EXTERNAL_STORAGE}, RESULT_LOAD_IMAGE);
}
} // get image
private void getImageFromGalery() {
intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, RESULT_LOAD_IMAGE);
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == Activity.RESULT_OK && data != null) {
// get Image URL
Uri selectedImage = data.getData();
String[] filePathColumns = {MediaStore.Images.Media.DATA};
Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
String imagePath = c.getString(columnIndex); // change image URL to Bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
protrait = BitmapFactory.decodeFile(imagePath, options); // you can output the selectedImage and imagePath
// tvUploadPortrait.setText("selectedImage : "+selectedImage+"\n\n imagePath: "+imagePath); // set ImageView
if (protrait == null) {
ivUploadProtrait.setImageResource(R.drawable.ic_portrait);
} else {
ivUploadProtrait.setImageBitmap(protrait);
} c.close();
}
}

使用OkHttp上传图片到服务器的更多相关文章

  1. Android 上传图片到服务器 okhttp一

    [目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...

  2. 通过android 客户端上传图片到服务器

    昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传 ...

  3. Wcf for wp8 上传图片到服务器,将图片名字插入数据库字段(五)

    环境:.NET Framework 3.5 服务: IIS EXpress托管 WCF服务程序 配置:Web.config <!--<connectionStrings> <a ...

  4. .NET开发微信小程序-上传图片到服务器

    1.上传图片分为几种: a:上传图片到本地(永久保存) b:上传图片到本地(临时保存) c:上传图片到服务器 a和b在小程序的api文档里面有.直接说C:上传图片到服务器 前端代码: /* 上传图片到 ...

  5. Android 上传图片到服务器二--------调用相机7.0以上权限问题

    [目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...

  6. java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)

    最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...

  7. iOS开发通过AFNetworking上传图片到服务器

    iOS开发通过AFNetworking上传图片到服务器 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager. ...

  8. c#批量上传图片到服务器示例分享

    这篇文章主要介绍了c#批量上传图片到服务器示例,服务器端需要设置图片存储的虚拟目录,需要的朋友可以参考下 /// <summary> /// 批量上传图片 /// </summary ...

  9. 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器

    上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...

随机推荐

  1. 用matplotlib统计数据并画图

    用jupyter来统计数据,画出柱状图 import numpy as np import pandas as pd import matplotlib.pyplot as plt import ma ...

  2. 从内存上限说起 VMware内存分配初探

    原文链接:http://blog.51cto.com/cxpbt/463777 [IT168 应用技巧]为方便识别虚拟的资源和物理(或叫真实的)资源,本人文章中以小写字母v前缀标识虚拟资源,小写字母p ...

  3. 1.1 js中函数定义解析(学习笔记)

    1.1.1函数的分类 函数声明式 :使用function声明函数,并指定函数名. 函数表达式:使用function声明函数,但未指定函数名. 函数表达式2.匿名函数,匿名函数有很多作用,赋予一个变量则 ...

  4. html5有哪些新特性、移除了那些元素?

    新增的元素: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 拖拽释放(Drag and drop) API 语义化更好的内容标签(header,nav, ...

  5. C++ 模板练习1

    //特定的模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...

  6. python 符号小技巧

    1 用于解释 对于不想放入程序中执行的句子  用来解释的 在Python中 单行注释用   #   多行注释用 """ 这个句子不会在Python中表达出来 " ...

  7. RK3399开发板Android镜像烧写之Windows系统映像烧写

    4.1.1 l RKTool  驱动安装(基于迅为iTOP-3399开发板)DriverAssitant_v4.5.zip 文件,打开 驱动安装成功,如下图: 注意事项:1.目前支持的操作系统包括:X ...

  8. MySQL优化查询相关

    [查询优化相关] 1.如何定位相关慢的查询: a.可以开启慢查询日志,也可以使用show profiles 去记录相关查询到一个临时表再分析. b.show processlist  看看有没有大量等 ...

  9. C语言获取本机ip

    一.参考网址 1.c语言获取本机IP 二.源码 #include <stdio.h> #include <stdint.h> #include <stdlib.h> ...

  10. 计蒜客 置换的玩笑(DFS)

    传送门 题目大意: 小蒜头又调皮了.这一次,姐姐的实验报告惨遭毒手. 姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔.但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数 ...