使用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服务器项目(六)—— 上传图片至服务器
上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...
随机推荐
- DevOps专题|Packer使用教程
什么是Packer 简单介绍一下自己 Packer 是一个轻量命令行工具, 能在几乎所有主流的操作系统上运行. 在给定一份配置文件的情况下, Packer 能为多种系统架构创建云主机镜像.同时 Pac ...
- nested exception is java.lang.IllegalArgumentException: warning no match for this type name: res [Xlint:invalidAbsoluteTypeName]
注:内有单词(sping)写错,请忽略,不影响程序运行 运行时报错: Exception in thread "main" org.springframework.beans.fa ...
- Java查漏补缺(3)(面向对象相关)
Java查漏补缺(3) 继承·抽象类·接口·静态·权限 相关 this与super关键字 this的作用: 调用成员变量(可以用来区分局部变量和成员变量) 调用本类其他成员方法 调用构造方法(需要在方 ...
- kubele常用配置
KUBELET_OPTS="--logtostderr=true \--v=4 \--hostname-override=10.83.52.147 \--kubeconfig=/usr/lo ...
- Mac Github:第一次上传成功,解决图片不可显示,Initial commit Untracked files
在上传之前需要先给自己的电脑安装SSH 上传成功用的是github的官方提示,直接复制去做就可以了 解决README.md中图片不可显示:图片路径到底要怎么写? https://blog.csdn.n ...
- pywin32获得tkinter窗口句柄,并在上面绘图
想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc.尝试了FindWindow(),GetActiveWindo ...
- Eclipse 配置spring boot pom.xml第1行报错的两种解决办法
现象 通过spring boot项目导入eclipse后,pom.xml文件的第一行总是报错.这里使用的spring版本是2.1.5,2.1.4以前的版本等其他版本的spring没有这个问题. 解决办 ...
- 使用cropper插件裁剪并上传图片(Spring mvc)
cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. cropper有两种方式上传截 ...
- 修改Oracle数据库的字符集
2019年6月,来到了新的环境工作,接触了新的项目. 新的项目需要用Oracle数据库,虽然以前没用过,但是边学边用呗,在安装Oracle数据库的时候完全没有注意到要选择UTF-8的字符集,直接就默认 ...
- 深度学习常用的数据源(MNIST,CIFAR,VOC2007系列数据)
MINIST手写数据集 压缩包版: http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz http://yann.lecun.com/ ...