使用OkHttp上传图片到服务器
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上传图片到服务器的更多相关文章
- Android 上传图片到服务器 okhttp一
		
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...
 - 通过android 客户端上传图片到服务器
		
昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传 ...
 - Wcf for wp8 上传图片到服务器,将图片名字插入数据库字段(五)
		
环境:.NET Framework 3.5 服务: IIS EXpress托管 WCF服务程序 配置:Web.config <!--<connectionStrings> <a ...
 - .NET开发微信小程序-上传图片到服务器
		
1.上传图片分为几种: a:上传图片到本地(永久保存) b:上传图片到本地(临时保存) c:上传图片到服务器 a和b在小程序的api文档里面有.直接说C:上传图片到服务器 前端代码: /* 上传图片到 ...
 - Android 上传图片到服务器二--------调用相机7.0以上权限问题
		
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...
 - java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)
		
最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...
 - iOS开发通过AFNetworking上传图片到服务器
		
iOS开发通过AFNetworking上传图片到服务器 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager. ...
 - c#批量上传图片到服务器示例分享
		
这篇文章主要介绍了c#批量上传图片到服务器示例,服务器端需要设置图片存储的虚拟目录,需要的朋友可以参考下 /// <summary> /// 批量上传图片 /// </summary ...
 - 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器
		
上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
 
随机推荐
- WebView的学习
			
加载网页: 加载URL(网络或者本地assets文件下的html文件) 加载html代码 Native和JavaScript相互调用(利于混合开发) 1.加载网络URL webview.loadUrl ...
 - python 发送邮件,并且带附件
			
#!/usr/bin/pythonfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultiparti ...
 - CTF -攻防世界-crypto新手区(1~4)
			
题目已经提示用base64直接解密就行 base64解密网址 http://tool.oschina.net/encrypt?type=3 题目提示是凯撒密码 http://www.zjslove.c ...
 - 201709-2  公共钥匙盒 Java
			
思路: 按上课开始时间排一下序,一个时刻一个时刻判断要不要还钥匙,要不要借钥匙 import java.util.ArrayList; import java.util.Collections; im ...
 - linux下springboot项目通过jetty发布war包应用
			
Linux下jetty发布jar包 1.通过官网下载jetty点击下载https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distributi ...
 - idea 2018.3.4 破解
			
我的idea_home=C:\Program Files\\IntelliJ IDEA 2018.3.4\ 1.下载破解文件 链接:https://pan.baidu.com/s/1I2APmk-pj ...
 - ubuntu16.04 + Kdevelop + ROS开发和创建catkin_ws工作空间
			
https://blog.csdn.net/p942005405/article/details/75715288 https://blog.csdn.net/LOVE1055259415/artic ...
 - Vue.js——3.增删改查
			
vue 写假后台 bootstrap 做的样式 代码 <!DOCTYPE html> <html lang="en"> <head> < ...
 - 内存管理之栈stack
			
1.什么是栈 栈是一种数据结构,C语言中使用栈来保存局部变量.栈是被发明出来管理内存的.2.栈管理内存的特点(小内存.自动化) 先进后出 FILO first in last out ...
 - Django的URL路由基础
			
一.概述 URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下.实际上Django提倡项目有个根urls.py,各app下分别有自己的一个urls. ...