图片上传服务器

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

 

上传工具类:

 

[java] view plain copy print?

  1. import java.io.DataOutputStream;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.MalformedURLException;  
  8. import java.net.URL;  
  9. import java.util.UUID;  
  10.   
  11. /** 
  12.  *  
  13.  * 上传工具类 
  14.  *  
  15.  */  
  16. public class UploadUtils {  
  17.     private static final String TAG = "upload";  
  18.     private static final int TIME_OUT = 1000 * 1000; // 超时时间  
  19.     private static final String CHARSET = "utf-8"; // 设置编码  
  20.   
  21.     /** 
  22.      * android上传文件到服务器 
  23.      *  
  24.      * @param file 
  25.      *            需要上传的文件 
  26.      * @param RequestURL 
  27.      *            请求的rul 
  28.      * @return 返回响应的内容 
  29.      */  
  30.     public static String uploadFile(File file, String RequestURL) {  
  31.         String result = null;  
  32.         String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成  
  33.         String PREFIX = "--", LINE_END = "\r\n";  
  34.         String CONTENT_TYPE = "multipart/form-data"; // 内容类型  
  35.   
  36.         try {  
  37.             URL url = new URL(RequestURL);  
  38.             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  39.             conn.setReadTimeout(TIME_OUT);  
  40.             conn.setConnectTimeout(TIME_OUT);  
  41.             conn.setDoInput(true); // 允许输入流  
  42.             conn.setDoOutput(true); // 允许输出流  
  43.             conn.setUseCaches(false); // 不允许使用缓存  
  44.             conn.setRequestMethod("POST"); // 请求方式  
  45.             conn.setRequestProperty("Charset", CHARSET); // 设置编码  
  46.             conn.setRequestProperty("connection", "keep-alive");  
  47.             conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary="  
  48.                     + BOUNDARY);  
  49.   
  50.             if (file != null) {  
  51.                 /** 
  52.                  * 当文件不为空,把文件包装并且上传 
  53.                  */  
  54.                 DataOutputStream dos = new DataOutputStream(  
  55.                         conn.getOutputStream());  
  56.                 StringBuffer sb = new StringBuffer();  
  57.                 sb.append(PREFIX);  
  58.                 sb.append(BOUNDARY);  
  59.                 sb.append(LINE_END);  
  60.                 /** 
  61.                  * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 
  62.                  * filename是文件的名字,包含后缀名的 比如:abc.png 
  63.                  */  
  64.   
  65.                 sb.append("Content-Disposition: form-data; name=\"upload\"; filename=\""  
  66.                         + file.getName() + "\"" + LINE_END);  
  67.                 sb.append("Content-Type: application/octet-stream; charset="  
  68.                         + CHARSET + LINE_END);  
  69.                 sb.append(LINE_END);  
  70.                 dos.write(sb.toString().getBytes());  
  71.                 InputStream is = new FileInputStream(file);  
  72.                 byte[] bytes = new byte[1024];  
  73.                 int len = 0;  
  74.                 while ((len = is.read(bytes)) != -1) {  
  75.                     dos.write(bytes, 0, len);  
  76.                 }  
  77.                 is.close();  
  78.                 dos.write(LINE_END.getBytes());  
  79.                 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)  
  80.                         .getBytes();  
  81.                 dos.write(end_data);  
  82.                 dos.flush();  
  83.                 /** 
  84.                  * 获取响应码 200=成功 当响应成功,获取响应的流 
  85.                  */  
  86.                 int res = conn.getResponseCode();  
  87.                 // if(res==200)  
  88.                 // {  
  89.                 InputStream input = conn.getInputStream();  
  90.                 StringBuffer sb1 = new StringBuffer();  
  91.                 int ss;  
  92.                 while ((ss = input.read()) != -1) {  
  93.                     sb1.append((char) ss);  
  94.                 }  
  95.                 result = sb1.toString();  
  96.                 System.out.println(result);  
  97.                 // if(res==200)  
  98.                 // {  
  99.   
  100.                 // }  
  101.                 // else{  
  102.                 // Log.e(TAG, "request error");  
  103.                 // }  
  104.             }  
  105.         } catch (MalformedURLException e) {  
  106.             e.printStackTrace();  
  107.         } catch (IOException e) {  
  108.             e.printStackTrace();  
  109.         }  
  110.         return result;  
  111.     }  
  112. }  
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;
	}
}

 

 

图片上传封装类:

 

[java] view plain copy print?

  1. import java.io.File;  
  2.   
  3. import android.os.Environment;  
  4.   
  5. public class TUploadFile {  
  6.   
  7.     private static TUploadFile mTUploadFile = null;  
  8.   
  9.     private TUploadFile() {  
  10.     }  
  11.   
  12.     public synchronized static TUploadFile getInstance() {  
  13.         if (mTUploadFile == null)  
  14.             mTUploadFile = new TUploadFile();  
  15.         return mTUploadFile;  
  16.     }  
  17.   
  18.     public String TUploadHeadImage(String cusId) {//用户ID号,上传头像,一个用户对应一个头像  
  19.         String result = "";  
  20.                 //比如说通过拍照裁剪后先保存在本地命名为myphoto.png,然后从本地上传到服务器上  
  21.                 result = UploadUtils.uploadFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/myphoto.png"),"服务器域名" + cusId);  
  22.         return result;  
  23.     }  
  24. }  
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类:

 

[java] view plain copy print?

  1. public class TestApplication extends Application {  
  2.     private static TestApplication mInstance = null;  
  3.     public static TUploadFile mTUploadFile;  
  4.   
  5.     // 单例模式中获取唯一的TestApplication实例  
  6.     public static TestApplication getInstance() {  
  7.         if (null == mInstance)  
  8.             mInstance = new TestApplication();  
  9.                 return mInstance;  
  10.     }  
  11.   
  12.     public void onCreate() {  
  13.          super.onCreate();  
  14.       
  15.          mTUploadFile = TUploadFile.getInstance();  
  16.     }  
  17.   
  18. }  
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();
	}

}

 

 

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

 

[java] view plain copy print?

  1. public class AsyncHeadUpTask extends AsyncTask<String, Integer, String> {  
  2.         // 上传头像  
  3.         protected String doInBackground(String... params) {  
  4.             String code = "";  
  5.             try {  
  6.                 String result = TestApplication.mTUploadFile.TUploadHeadImage(params[0]);//参数为用户ID  
  7.                 JSONObject resultCode = new JSONObject(result);  
  8.                 code = resultCode.getString("commonACK");//服务器端返回的验证码  
  9.             } catch (Exception e) {  
  10.                 e.printStackTrace();  
  11.             }  
  12.              return code;  
  13.         }  
  14.   
  15.         protected void onPostExecute(String result) {  
  16.             stopProgressDialog();//上传成功后停止延迟动画  
  17.             if (result.equals("111111")) {// 服务器返回来的验证码为111111时表示上传头像成功  
  18.                 Toast.makeText(getActivity(), "上传头像成功", Toast.LENGTH_SHORT).show();  
  19.             } else {  
  20.                 Toast.makeText(getActivity(), "网络连接错误", Toast.LENGTH_SHORT).show();  
  21.                 }  
  22.         }  
  23.   
  24.         protected void onPreExecute() {  
  25.             super.onPreExecute();  
  26.             startUpProgressDialog();//上传延时动画  
  27.         }  
  28.     }  
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文件里调用上面的异步上传头像图片的方法即可实现向服务器上传头像的功能。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值