Android向服务器发送图片(一)

   作为一个Android菜鸟,花了好久时间才搞定的发送图片功能,特在此写下,希望对后者有帮助。先说说我的思路:在Android通过相册选择图片,然后利用Base64对图片进行编码,再用json对图片编码和图片名进行打包发送。
  • Android端
    由于篇幅限制,有关相册的部分内容参考郭霖的《第一行代码》
    没有的可以私我。
    接下来就上代码了

    建议使用google的json解析库,在build.gradle添加如下代码:

  implementation 'com.google.code.gson:gson:2.8.5'
  • Image.class(工具类)
public class Image {String image,imagename;public String getImage() {return image;}public void setImage(String image) {this.image = image;}public String getImagename() {return imagename;}public void setImagename(String imagename) {this.imagename = imagename;}
}
  • Base64Util.class
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class Base64Util {//回收图片所占的内存public static void gcBitmap(Bitmap bitmap) {if (bitmap != null && !bitmap.isRecycled()) {bitmap.recycle(); // 回收图片所占的内存bitmap = null;System.gc(); // 提醒系统及时回收}}/**** @Title: bitmapToBase64* @Description: TODO(Bitmap 转换为字符串)* @param @param bitmap* @param @return    设定文件* @return String    返回类型* @throws*///图片编码@SuppressLint("NewApi")public static String bitmapToBase64(Bitmap bitmap) {// 要返回的字符串String reslut = null;ByteArrayOutputStream baos = null;try {if (bitmap != null) {baos = new ByteArrayOutputStream();/*** 压缩只对保存有效果bitmap还是原来的大小*/bitmap.compress(Bitmap.CompressFormat.JPEG, 10, baos);baos.flush();// 转换为字节数组byte[] byteArray = baos.toByteArray();// 转换为字符串reslut = Base64.encodeToString(byteArray, Base64.DEFAULT);baos.close();} else {return null;}} catch (IOException e) {e.printStackTrace();}  finally {try {if (baos != null) {baos.close();}} catch (IOException e) {e.printStackTrace();}}return reslut;}/**** @Title: base64ToBitmap* @Description: TODO(base64l转换为Bitmap)* @param @param base64String* @param @return    设定文件* @return Bitmap    返回类型* @throws*///编码转为图片public static Bitmap base64ToBitmap(String base64String){byte[] decode = Base64.decode(base64String, Base64.DEFAULT);Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length);return bitmap;}
}
  • HttpUtil.class(上传工具类)
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;public class HttpUtil {//用于解析字符串public static String doJsonPost(URL url, String jsonstr) {HttpURLConnection urlConnection = null;System.out.println("tag"+"这只从客户端得到的数据"+jsonstr);try {urlConnection = (HttpURLConnection) url.openConnection();//打开http连接urlConnection.setConnectTimeout(8000);//连接的超时时间urlConnection.setUseCaches(false);//不使用缓存//urlConnection.setFollowRedirects(false);是static函数,作用于所有的URLConnection对象。urlConnection.setInstanceFollowRedirects(true);//是成员函数,仅作用于当前函数,设置这个连接是否可以被重定向urlConnection.setReadTimeout(8000);//响应的超时时间urlConnection.setDoInput(true);//设置这个连接是否可以写入数据urlConnection.setDoOutput(true);//设置这个连接是否可以输出数据urlConnection.setRequestMethod("POST" );//设置请求的方式urlConnection.setRequestProperty("Connection", "Keep-Alive");urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");//设置消息的类型urlConnection.connect();// 连接,从上述至此的配置必须要在connect之前完成,实际上它只是建立了一个与服务器的TCP连接OutputStream out = urlConnection.getOutputStream();//输出流,用来发送请求,http请求实际上直到这个函数里面才正式发送出去BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));//创建字符流对象并用高效缓冲流包装它,便获得最高的效率,发送的是字符串推荐用字符流,其它数据就用字节流bw.write(jsonstr);//把json字符串写入缓冲区中bw.flush();//刷新缓冲区,把数据发送出去,这步很重要out.close();bw.close();//使用完关闭if(urlConnection.getResponseCode()==HttpURLConnection.HTTP_OK){//得到服务端的返回码是否连接成功InputStream in = urlConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = br.readLine()) != null) {response.append(line);}return response.toString();}}catch (Exception e) {}finally{urlConnection.disconnect();//使用完关闭TCP连接,释放资源}return null;}
}
  • CameraActivity.class
    这个类只给出上传部分的逻辑代码,关于相机和相册的部分操作可参考《第一行代码》,毕竟笔者也是学习郭霖大佬的。
    public class CameraActivity extends AppCompatActivity {".......此处省略了打开相册和相机的逻辑操作.......""布局文件也不会给出"//在imageview上展示图片@RequiresApi(api = Build.VERSION_CODES.O)private void displayImage(String imagePath){if(imagePath!=null){//服务器中图片servlet对应的路径String uri="http://服务器ip:8080/Server/ImageServlet";Bitmap bitmap=BitmapFactory.decodeFile(imagePath);String picture=new Base64Util().bitmapToBase64(bitmap);Image image=new Image();image.setImage(picture);image.setImagename("photo.jpg");Gson gson = new Gson();Type type = new TypeToken<Image>(){}.getType();String jsonstr = gson.toJson(image,type);//mtest(imagePath);new CameraActivity.upPicture().execute(uri,jsonstr);Log.v("上传图片","成功");roundImageView.setImageBitmap(bitmap);}else {Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();}}//上传异步类class upPicture extends AsyncTask<String,Integer,String>{@Overrideprotected String doInBackground(String... params) {String par  = params[0];//urlString picturejson = params[1];//stringjava.net.URL url = null;try {url = new URL(par);} catch (MalformedURLException e) {e.printStackTrace();}String result = HttpUtil.doJsonPost(url,picturejson);return result;}@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);int i = Integer.parseInt(result);if(i==1){Toast.makeText(getApplicationContext(),"上传成功", Toast.LENGTH_SHORT).show();return;}else {if (i == -1) {Toast.makeText(getApplicationContext(), "上传失败", Toast.LENGTH_SHORT).show();return;}}}}
}

到此Android端差不多可以了,欢迎大佬批评指教!

Android向服务器发送图片(一)相关推荐

  1. C++实现服务器发送图片

    C++实现服务器发送图片 这里是一个简单的图片服务器,每次向这个服务器发送请求后,都会得到一个图片. 特点: 负责发送图片的函数,接收的是string类型的值 重点: 在获取string图片的char ...

  2. Android 向服务器发送XML数据及调用webservice

    首先讲一下webservice概念 可以看作是网络上的API,不过不是是通过new XXX().api()调用: 调用方式:客户端发送一段xml到服务器,在xml中指定要调用的方法的名称,以及各项参数 ...

  3. Android聊天页面发送图片定制(类似微信)

    前言 微信聊天页面的图片显示是一个自定制的形状,和它的聊天背景形状一样,在此仿微信定制了一个工具,可以自定制他的形状.前提是要有个背景图片.我在此封装的是网络和本地图片的定制工具类,基于univers ...

  4. openfire android 发送图片,基于openfire+smack开发Android即时聊天应用[四]-单人聊天、群聊、发送接收文件等...

    这篇文章主要介绍如何实现点对点单人聊天.多人的群聊.以及如何给对方发送文件,如何发送图片消息和语音消息等功能. 1.单人聊天 1.首先创建聊天对象 /** * 创建聊天窗口 * @param jid ...

  5. 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP 服务器 | 发送 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. Java 层传入的 RTMP 推流地址处理 二. RTMPDump 推流线程 三. 创建 RTMP 对象 四. 初始化 RTMP 对象 五. 设置 RTMP ...

  6. Android --- 怎么样在布局中显示服务器的图片,或者是后台项目中的图片+connect failed: ECONNREFUSED (Connection refused)问题的解决(文章最后)

    今天在写Android项目的时候遇到这样一个问题,我已经从后台SpringBoot中拿到了图片id,但是要怎么样显示到AS端呢? 首先看到了网上有用Glide的,我在这里整理一下简单明了的操作步骤 1 ...

  7. [转]android之Apache Http——向服务器发送请求的同时发送参数

    android之Apache Http--向服务器发送请求的同时发送参数 使用Get方法提交: 其他步骤与上一节的操作相符,只是在传送地址的时候发送参数的格式如下: //Sname和Sage是实际的数 ...

  8. android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据

    最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...

  9. android百度输入法表情符号,分析Android 搜狗输入法在微信和QQ中发送图片和表情...

    好记性不如烂笔头.生活中多做笔记,不仅可以方便自己,还可以方便他人. 背景 有没有发现,有时候表情或图片的交流更能让气氛更愉悦.斗图,成了群里的日常小事,然而,当你没有图可斗的时候就尴尬了.最近,搜狗 ...

最新文章

  1. 利用spring aop统一处理异常和打日志
  2. 【转】人脸识别功能的用户体验设计优化
  3. JVM,JDK,JRE和OpenJDK有什么区别?
  4. java lists 引用包,在线等java【不在同一类,同一个包的两个LIst可以实现复制么?怎...
  5. 封装EF code first用存储过程的分页方法
  6. python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫
  7. 基于JAVAEE公共自行车租赁系统
  8. H3C交换机配置命令大全
  9. 泛函分析 04.01 有界线性算子 - 有界线性算子与有界线性泛函
  10. c语言薛定谔方程,如何解薛定谔方程?-- k · p method
  11. 服务器 ssd虚拟内存设置,ssd虚拟内存怎么设置最好
  12. 句子迷 APP,MVP 架构,Okhttp + Retrofit + RxJava,图片加载 Glide,数据库 Object-box
  13. 移动硬盘格式化了的数据找到法子
  14. [免费]寻觅程序运行名字
  15. [作品]文本修辑转换器
  16. mtk平台android编译命令,MTK 常见的编译命令
  17. 耀世升级,第三版Java多线程核心技术手册,成长之路必不可少
  18. 2021“载歌在谷”线上春晚震撼来袭!
  19. 如何判断一个网站是WordPress搭建的网站以及网站SEO网络推广
  20. 单人被罩标准的尺寸是多少

热门文章

  1. sql server 2000企业管理器中没有项目
  2. linux 类似winscp_winscp 有没有Linux版的
  3. 一组Android机器人素材图片
  4. Java环境下运行fastqc_质控软件fastQC的安装及用法
  5. ubuntu测网速方法
  6. 淘宝详情页排版布局怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  7. 图标(Icon)和图标按钮(IconButton)
  8. JavaScript小项目总结
  9. 如何有效管理游戏开发过程
  10. linux常用重启命令,linux常用关机和重启命令