Android中向服务器上传图片

Android开发中有很多情况下,需要实现向服务器上传图片,比如说开发APP过程需要实现上传头像等信息。这篇文章给出了Android终端上传头像图片的方法与简析。

上传工具类:

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

/**
 *
 * 上传工具类
 *
 */
public class UploadUtils {
	private static final String TAG = "upload";
	private static final int TIME_OUT = 1000 * 1000; // 超时时间
	private static final String CHARSET = "utf-8"; // 设置编码

	/**
	 * android上传文件到服务器
	 *
	 * @param file
	 *            需要上传的文件
	 * @param RequestURL
	 *            请求的rul
	 * @return 返回响应的内容
	 */
	public static String uploadFile(File file, String RequestURL) {
		String result = null;
		String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
		String PREFIX = "--", LINE_END = "\r\n";
		String CONTENT_TYPE = "multipart/form-data"; // 内容类型

		try {
			URL url = new URL(RequestURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(TIME_OUT);
			conn.setConnectTimeout(TIME_OUT);
			conn.setDoInput(true); // 允许输入流
			conn.setDoOutput(true); // 允许输出流
			conn.setUseCaches(false); // 不允许使用缓存
			conn.setRequestMethod("POST"); // 请求方式
			conn.setRequestProperty("Charset", CHARSET); // 设置编码
			conn.setRequestProperty("connection", "keep-alive");
			conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary="
					+ BOUNDARY);

			if (file != null) {
				/**
				 * 当文件不为空,把文件包装并且上传
				 */
				DataOutputStream dos = new DataOutputStream(
						conn.getOutputStream());
				StringBuffer sb = new StringBuffer();
				sb.append(PREFIX);
				sb.append(BOUNDARY);
				sb.append(LINE_END);
				/**
				 * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
				 * filename是文件的名字,包含后缀名的 比如:abc.png
				 */

				sb.append("Content-Disposition: form-data; name=\"upload\"; filename=\""
						+ file.getName() + "\"" + LINE_END);
				sb.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINE_END);
				sb.append(LINE_END);
				dos.write(sb.toString().getBytes());
				InputStream is = new FileInputStream(file);
				byte[] bytes = new byte[1024];
				int len = 0;
				while ((len = is.read(bytes)) != -1) {
					dos.write(bytes, 0, len);
				}
				is.close();
				dos.write(LINE_END.getBytes());
				byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)
						.getBytes();
				dos.write(end_data);
				dos.flush();
				/**
				 * 获取响应码 200=成功 当响应成功,获取响应的流
				 */
				int res = conn.getResponseCode();
				// if(res==200)
				// {
				InputStream input = conn.getInputStream();
				StringBuffer sb1 = new StringBuffer();
				int ss;
				while ((ss = input.read()) != -1) {
					sb1.append((char) ss);
				}
				result = sb1.toString();
				System.out.println(result);
				// if(res==200)
				// {

				// }
				// else{
				// Log.e(TAG, "request error");
				// }
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}
}

图片上传封装类:

import java.io.File;

import android.os.Environment;

public class TUploadFile {

	private static TUploadFile mTUploadFile = null;

	private TUploadFile() {
	}

	public synchronized static TUploadFile getInstance() {
		if (mTUploadFile == null)
			mTUploadFile = new TUploadFile();
		return mTUploadFile;
	}

	public String TUploadHeadImage(String cusId) {//用户ID号,上传头像,一个用户对应一个头像
		String result = "";
                //比如说通过拍照裁剪后先保存在本地命名为myphoto.png,然后从本地上传到服务器上
                result = UploadUtils.uploadFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/myphoto.png"),"服务器域名" + cusId);
		return result;
	}
}

APP应用中保存全局变量的Application类:

public class TestApplication extends Application {
	private static TestApplication mInstance = null;
	public static TUploadFile mTUploadFile;

	// 单例模式中获取唯一的TestApplication实例
	public static TestApplication getInstance() {
		if (null == mInstance)
			mInstance = new TestApplication();
		        return mInstance;
	}

 	public void onCreate() {
		 super.onCreate();

 		 mTUploadFile = TUploadFile.getInstance();
	}

}

采用异步方式进行上传头像图片的方法:

public class AsyncHeadUpTask extends AsyncTask<String, Integer, String> {
		// 上传头像
		protected String doInBackground(String... params) {
			String code = "";
			try {
				String result = TestApplication.mTUploadFile.TUploadHeadImage(params[0]);//参数为用户ID
				JSONObject resultCode = new JSONObject(result);
				code = resultCode.getString("commonACK");//服务器端返回的验证码
 			} catch (Exception e) {
				e.printStackTrace();
			}
			 return code;
		}

 		protected void onPostExecute(String result) {
			stopProgressDialog();//上传成功后停止延迟动画
			if (result.equals("111111")) {// 服务器返回来的验证码为111111时表示上传头像成功
				Toast.makeText(getActivity(), "上传头像成功", Toast.LENGTH_SHORT).show();
			} else {
				Toast.makeText(getActivity(), "网络连接错误", Toast.LENGTH_SHORT).show();
    			}
		}

		protected void onPreExecute() {
			super.onPreExecute();
			startUpProgressDialog();//上传延时动画
  		}
	}

主Acitivty文件里调用上面的异步上传头像图片的方法即可实现向服务器上传头像的功能。

时间: 2024-10-12 09:07:56

Android中向服务器上传图片的相关文章

Android中FTP服务器搭建入门

ftp服务器简单介绍:FTP(File Transfer Protocol)是文件传输协议的简称. 作用:让用户连接上一个远程计算机(该计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去. Apache 官网ftpserver有详细介绍和使用说明以及必要文件下载:http://mina.apache.org/ftpserver-project/embedding_ftpserver.html 首先要阅读官网上的介

Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

效果: 注意:1:网络权限<uses-permission android:name="android.permission.INTERNET"></uses-permission>2:我封装了一个OKHttp,需要在build.gradle 中加入compile 'com.squareup.okhttp3:logging-interceptor:3.4.2' 在同步一在3:用SharedPreferences 保存和获取图片了,将图片和字符串进行了转换4: 可

Android中即时通讯协议选择

Android中的即时通讯,就是客户端要与服务器建立长时间的连接,正常情况下Android中请求服务器数据后,连接一般断开.但即时通讯类的对消息的实时性要求比较高.需要客户端与服务器建立长时间的连接,这样,才能保证消息的时实性. 1.XMPP协议 1.XMPP基于xml,XMPP用TCP传递的是xml流.它具有xml的灵活性和扩展性.可以实现服务类实时通讯. XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上.借助于XML易于解析和阅读的特性. XMPP核

Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756989) 前言:现在很多APP都需要云的功能,也就是通过网络与服务器交换数据.有的采用tcp/ip协议,但是你必须拥有一个固定ip的服务器,可以购买阿里云服务器之类的,就是贵了点.如果只是个人的小应用的的话可以采用新浪云平台这种免费的服务器,采用的协议是http协议,具体实现方式如下: 方式一.在线

Android中网络编程以及与服务器上Web项目的基础交互

该博文中内容通过老师上课的内容对于Android下的网络通信编程等内容进行总结: 1.Android网络编程初识 2.Android实现HTML源码查看 3.Android实现网络图片查看 4.Android实现与服务器上JavaWeb项目交互 1.Android网络编程初识 Android手机终端作为客户端发送Http请求到终端服务器上,并且当发送请求到服务器,如果请求成功,响应码:200:服务器会通过客户端返回请求并且处理后的信息数据,一般情况下,在正式项目中多用JSON,不会使用没有规定格

Android初级教程:Android中解析方式之pull解析

在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式.有兴趣的读者可以去javaweb篇里面找相关的内容. 先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml: <?xml version='1.0' encoding='utf-8' standalone=

在android中画圆形图片的几种办法

在开发中经常会有一些需求,比如显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其他的一些形状.但是往往我们手上的图片或者从服务器获取到的图片都是方形的.这时候就需要我们自己进行处理,将图片处理成所需要的形状.正如茴香豆的的"茴"写法大于一种,经过我的研究,画出特殊图片的方法也不是一种,我发现了三种,且听我一一道来. 使用Xfermode 两图相交方式 通过查找资料发现android中可以设置画笔的Xfermode即相交模式,从而设置两张图相交之后的显示方式,具体模式见下图,源

Android 中实现分享和第三方登陆---以新浪微博为例

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957 第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义.下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆.首先你

Android中使用http协议访问网络

HTTP协议的工作原理:客户端向服务器端发送http请求,服务器端收到请求后返回一下数据给客户端,客户端接受消息并进行解析. 在Android中发送http请求的方式有两种,第一种是通过HttpURLConnection的方式,第二种是通过HttpClient的方式. 通过HttpURLConnection的方式发送http请求 通常分为以下5个步骤: 1.获取HttpURLConnection实例对象.先new一个URL实例,然后调用该对象的openConnection()方法. 2.设置ht