Android实现上传图片至java服务器
时间:2018-08-16
这篇文章主要为大家详细介绍了Android实现上传图片至java服务器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这几天有做到一个小的案例,手机拍照、相册照片上传到服务器。客户端和服务器的代码都贴出来:
客户端
AndroidManifest.xml添加以下权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
客户端的上传图片activity_upload.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="300dp"/> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="42dp" android:layout_margin="16dp" android:background="@drawable/edit_text_bg"/> <Button android:id="@+id/choose_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择图片"/> <Button android:id="@+id/upload_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="上传图片"/> </LinearLayout>
UploadActivity.java界面代码
package com.eric.uploadimage; import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Base64; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import java.io.ByteArrayOutputStream; import cz.msebera.android.httpclient.Header; @SuppressLint("NewApi") public class UploadActivity extends AppCompatActivity implements View.OnClickListener { private EditText editTextName; private ProgressDialog prgDialog; private int RESULT_LOAD_IMG = 1; private RequestParams params = new RequestParams(); private String encodedString; private Bitmap bitmap; private String imgPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); prgDialog= new ProgressDialog(this); prgDialog.setCancelable(false); editTextName = (EditText) findViewById(R.id.editText); findViewById(R.id.choose_image).setOnClickListener(this); findViewById(R.id.upload_image).setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.choose_image: loadImage(); break; case R.id.upload_image: uploadImage(); break; } } public void loadImage() { //这里就写了从相册中选择图片,相机拍照的就略过了 Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(galleryIntent, RESULT_LOAD_IMG); } //当图片被选中的返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); try { if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; // 获取游标 Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imgPath = cursor.getString(columnIndex); cursor.close(); ImageView imgView = (ImageView) findViewById(R.id.imageView); imgView.setImageBitmap(BitmapFactory.decodeFile(imgPath)); } else { Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG).show(); } } //开始上传图片 private void uploadImage() { if (imgPath != null && !imgPath.isEmpty()) { prgDialog.setMessage("Converting Image to Binary Data"); prgDialog.show(); encodeImagetoString(); } else { Toast.makeText(getApplicationContext(), "You must select image from gallery before you try to upload", Toast.LENGTH_LONG).show(); } } public void encodeImagetoString() { new AsyncTask<Void, Void, String>() { protected void onPreExecute() { }; @Override protected String doInBackground(Void... params) { BitmapFactory.Options options = null; options = new BitmapFactory.Options(); options.inSampleSize = 3; bitmap = BitmapFactory.decodeFile(imgPath, options); ByteArrayOutputStream stream = new ByteArrayOutputStream(); // 压缩图片 bitmap.compress(Bitmap.CompressFormat.PNG, 50, stream); byte[] byte_arr = stream.toByteArray(); // Base64图片转码为String encodedString = Base64.encodeToString(byte_arr, 0); return ""; } @Override protected void onPostExecute(String msg) { prgDialog.setMessage("Calling Upload"); // 将转换后的图片添加到上传的参数中 params.put("image", encodedString); params.put("filename", editTextName.getText().toString()); // 上传图片 imageUpload(); } }.execute(null, null, null); } public void imageUpload() { prgDialog.setMessage("Invoking JSP"); String url = "http://172.18.2.73:8080/upload/uploadimg.jsp"; AsyncHttpClient client = new AsyncHttpClient(); client.post(url, params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] bytes) { prgDialog.hide(); Toast.makeText(getApplicationContext(), "upload success", Toast.LENGTH_LONG).show(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] bytes, Throwable throwable) { prgDialog.hide(); if (statusCode == 404) { Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show(); } // 当 Http 响应码'500' else if (statusCode == 500) { Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show(); } // 当 Http 响应码 404, 500 else { Toast.makeText( getApplicationContext(), "Error Occured n Most Common Error: n1. Device " + "not connected to Internetn2. Web App is not deployed in App servern3." + " App server is not runningn HTTP Status code : " + statusCode, Toast.LENGTH_LONG).show(); } } }); } @Override protected void onDestroy() { super.onDestroy(); if (prgDialog != null) { prgDialog .dismiss(); } } }
服务端
这里用是Intellij Idea 2016.3.1+Tomcat 搭建的本地服务器,前篇文章有介绍具体的搭建步骤。
服务端项目结构:UploadImage.javauploadimg.jsp`、lib库
UploadImage.java 类
public class UploadImage { public static void convertStringtoImage(String encodedImageStr, String fileName) { try { // Base64解码图片 byte[] imageByteArray = Base64.decodeBase64(encodedImageStr); // FileOutputStream imageOutFile = new FileOutputStream("D:/uploads/" + fileName+".jpg"); imageOutFile.write(imageByteArray); imageOutFile.close(); System.out.println("Image Successfully Stored"); } catch (FileNotFoundException fnfe) { System.out.println("Image Path not found" + fnfe); } catch (IOException ioe) { System.out.println("Exception while converting the Image " + ioe); } } }
uploadimg.jsp 文件
<%@page import="com.eric.UploadImage"%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>图片上传</title> </head> <body> <% String imgEncodedStr = request.getParameter("image"); String fileName = request.getParameter("filename"); System.out.println("Filename: "+ fileName); if(imgEncodedStr != null){ UploadImage.convertStringtoImage(imgEncodedStr, fileName); out.print("Image upload complete, Please check your directory"); } else{ out.print("Image is empty"); } %> </body> </html>
运行结果:
客户端
服务端
觉得还不错的小伙伴们点个赞,鼓励一下!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 自动类型安全的.NET标准REST库refit
- 实现WebSocket和WAMP协议的开源库WampSharp
- Centos下部署DRBD+NFS+Keepalived高可用环境记录
- jQuery方法position()与offset()区别
- 温故而知新:设计模式之桥接模式(Bridge)
- 温故而知新:设计模式之装饰模式(Decorator)
- 域名“宝贝”baby.cn以71万元价格结拍
- 温故而知新:设计模式之组合模式(Composite)
- ruby学习笔记(7)-闭包
- ruby学习笔记(6)-Array的使用
- centos7下部署iptables环境纪录(关闭默认的firewalle)
- ruby学习笔记(5)-模块module的运用
- linux系统root密码遗忘的情况下的解决办法
- ruby学习笔记(4)-动态修改类的属性
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Handler实现线程之间的通信下载文件动态更新进度条
- Android下Button实现图文混排效果
- android handler.post和handler.sendMessage的区别和联系
- 3小时带你开发一款商城类小程序(零基础入门小程序系列)
- Android 隐式Intent的实例详解
- Android编程使用加速度传感器实现摇一摇功能及优化的方法详解
- 微信小程序分页加载数据~上拉加载更多~小程序云数据库的分页加载
- TextView实现跑马灯效果 就这么简单!
- Android自带emoji表情的使用方法详解
- Android EditText实现输入表情
- Android编程实现使用Intent传输包含自定义类的ArrayList示例
- EditText实现输入限制和校验功能实例代码
- java零基础入门006~springboot实现多文件的上传(java多文件的上传)
- Android编程实现随机生成颜色的方法示例
- Android中将Bitmap对象以PNG格式保存在内部存储中的方法