package com.spring.sky.image.upload.network;
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.Iterator;
import java.util.Map;
import java.util.UUID;
import android.util.Log;
/**
*
* 上传工具类
* @author spring sky<br>
* Email :vipa1888@163.com<br>
* QQ: 840950105<br>
* 支持上传文件和参数
*/
public class UploadUtil {
private static UploadUtil uploadUtil;
private static final String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
private static final String PREFIX = "--";
private static final String LINE_END = "\r\n";
private static final String CONTENT_TYPE = "multipart/form-data"; // 内容类型
private UploadUtil() {
}
/**
* 单例模式获取上传工具类
* @return
*/
public static UploadUtil getInstance() {
if (null == uploadUtil) {
uploadUtil = new UploadUtil();
}
return uploadUtil;
}
private static final String TAG = "UploadUtil";
private int readTimeOut = 10 * 1000; // 读取超时
private int connectTimeout = 10 * 1000; // 超时时间
/***
* 请求使用多长时间
*/
private static int requestTime = 0;
private static final String CHARSET = "utf-8"; // 设置编码
/***
* 上传成功
*/
public static final int UPLOAD_SUCCESS_CODE = 1;
/**
* 文件不存在
*/
public static final int UPLOAD_FILE_NOT_EXISTS_CODE = 2;
/**
* 服务器出错
*/
public static final int UPLOAD_SERVER_ERROR_CODE = 3;
protected static final int WHAT_TO_UPLOAD = 1;
protected static final int WHAT_UPLOAD_DONE = 2;
/**
* android上传文件到服务器
*
* @param filePath
* 需要上传的文件的路径
* @param fileKey
* 在网页上<input type=file name=xxx/> xxx就是这里的fileKey
* @param RequestURL
* 请求的URL
*/
public void uploadFile(String filePath, String fileKey, String RequestURL,
Map<String, String> param) {
if (filePath == null) {
sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");
return;
}
try {
File file = new File(filePath);
uploadFile(file, fileKey, RequestURL, param);
} catch (Exception e) {
sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");
e.printStackTrace();
return;
}
}
/**
* android上传文件到服务器
*
* @param file
* 需要上传的文件
* @param fileKey
* 在网页上<input type=file name=xxx/> xxx就是这里的fileKey
* @param RequestURL
* 请求的URL
*/
public void uploadFile(final File file, final String fileKey,
final String RequestURL, final Map<String, String> param) {
if (file == null || (!file.exists())) {
sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");
return;
}
Log.i(TAG, "请求的URL=" + RequestURL);
Log.i(TAG, "请求的fileName=" + file.getName());
Log.i(TAG, "请求的fileKey=" + fileKey);
new Thread(new Runnable() { //开启线程上传文件
@Override
public void run() {
toUploadFile(file, fileKey, RequestURL, param);
}
}).start();
}
private void toUploadFile(File file, String fileKey, String RequestURL,
Map<String, String> param) {
String result = null;
requestTime= 0;
long requestTime = System.currentTimeMillis();
long responseTime = 0;
try {
URL url = new URL(RequestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(readTimeOut);
conn.setConnectTimeout(connectTimeout);
conn.setDoInput(true); // 允许输入流
conn.setDoOutput(true); // 允许输出流
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST"); // 请求方式
conn.setRequestProperty("Charset", CHARSET); // 设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
// conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
/**
* 当文件不为空,把文件包装并且上传
*/
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
StringBuffer sb = null;
String params = "";
/***
* 以下是用于上传参数
*/
if (param != null && param.size() > 0) {
Iterator<String> it = param.keySet().iterator();
while (it.hasNext()) {
sb = null;
sb = new StringBuffer();
String key = it.next();
String value = param.get(key);
sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(LINE_END).append(LINE_END);
sb.append(value).append(LINE_END);
params = sb.toString();
Log.i(TAG, key+"="+params+"##");
dos.write(params.getBytes());
// dos.flush();
}
}
sb = null;
params = null;
sb = new StringBuffer();
/**
* 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png
*/
sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
sb.append("Content-Disposition:form-data; name=\"" + fileKey
+ "\"; filename=\"" + file.getName() + "\"" + LINE_END);
sb.append("Content-Type:image/pjpeg" + LINE_END); // 这里配置的Content-type很重要的 ,用于服务器端辨别文件的类型的
sb.append(LINE_END);
params = sb.toString();
sb = null;
Log.i(TAG, file.getName()+"=" + params+"##");
dos.write(params.getBytes());
/**上传文件*/
InputStream is = new FileInputStream(file);
onUploadProcessListener.initUpload((int)file.length());
byte[] bytes = new byte[1024];
int len = 0;
int curLen = 0;
while ((len = is.read(bytes)) != -1) {
curLen += len;
dos.write(bytes, 0, len);
onUploadProcessListener.onUploadProcess(curLen);
}
is.close();
dos.write(LINE_END.getBytes());
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
dos.write(end_data);
dos.flush();
//
// dos.write(tempOutputStream.toByteArray());
/**
* 获取响应码 200=成功 当响应成功,获取响应的流
*/
int res = conn.getResponseCode();
responseTime = System.currentTimeMillis();
this.requestTime = (int) ((responseTime-requestTime)/1000);
Log.e(TAG, "response code:" + res);
if (res == 200) {
Log.e(TAG, "request success");
InputStream input = conn.getInputStream();
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = input.read()) != -1) {
sb1.append((char) ss);
}
result = sb1.toString();
Log.e(TAG, "result : " + result);
sendMessage(UPLOAD_SUCCESS_CODE, "上传结果:"
+ result);
return;
} else {
Log.e(TAG, "request error");
sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:code=" + res);
return;
}
} catch (MalformedURLException e) {
sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());
e.printStackTrace();
return;
} catch (IOException e) {
sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());
e.printStackTrace();
return;
}
}
/**
* 发送上传结果
* @param responseCode
* @param responseMessage
*/
private void sendMessage(int responseCode,String responseMessage)
{
onUploadProcessListener.onUploadDone(responseCode, responseMessage);
}
/**
* 下面是一个
没有合适的资源?快使用搜索试试~ 我知道了~
Android拍照并上传文件到服务端源码
共105个文件
jar:24个
png:18个
class:17个
4星 · 超过85%的资源 需积分: 50 17 下载量 121 浏览量
2015-01-03
17:28:55
上传
评论
收藏 5.69MB RAR 举报
温馨提示
Android开发——通过HTTP协议,客户端发送图片到服务器,服务器接收图片,仅供参考。
资源推荐
资源详情
资源评论
收起资源包目录
Android拍照并上传文件到服务端源码 (105个子文件)
resources.ap_ 27KB
androidImageUpload.apk 39KB
jarlist.cache 120B
proguard.cfg 1KB
UploadUtil.class 9KB
MainActivity.class 6KB
SelectPicActivity.class 5KB
FileUpload.class 5KB
MainActivity$1.class 2KB
UploadUtil$1.class 1KB
R$drawable.class 948B
R$id.class 708B
R.class 706B
R$anim.class 503B
R$style.class 497B
R$layout.class 462B
R$string.class 454B
UploadUtil$OnUploadProcessListener.class 372B
R$attr.class 367B
BuildConfig.class 363B
UploadUtil$uploadProcessListener.class 266B
.classpath 2KB
.classpath 475B
org.eclipse.wst.common.component 468B
org.eclipse.wst.jsdt.ui.superType.container 49B
classes.dex 20KB
xwork-core-2.2.1.jar 997KB
freemarker-2.3.16.jar 860KB
struts2-core-2.2.1.jar 755KB
struts2-embeddedjsp-plugin-2.2.1.jar 662KB
commons-collections-3.2.jar 558KB
javassist-3.7.ga.jar 531KB
antlr-2.7.2.jar 350KB
commons-lang-2.3.jar 240KB
ognl-3.0.jar 224KB
commons-beanutils-1.7.0.jar 184KB
commons-digester-2.0.jar 145KB
commons-validator-1.3.1.jar 136KB
json-lib-2.1-jdk15.jar 122KB
commons-chain-1.2.jar 90KB
commons-io-1.3.2.jar 86KB
struts2-convention-plugin-2.2.1.jar 64KB
oro-2.0.8.jar 64KB
commons-fileupload-1.2.1.jar 56KB
struts2-json-plugin-2.2.1.jar 55KB
commons-logging-api-1.1.jar 44KB
commons-logging-1.0.4.jar 37KB
classworlds-1.1.jar 37KB
sslext-1.2-0.jar 26KB
aopalliance-1.0.jar 4KB
UploadUtil.java 9KB
SelectPicActivity.java 5KB
MainActivity.java 5KB
FileUpload.java 4KB
R.java 2KB
BuildConfig.java 169B
.jsdtscope 500B
index.jsp 1KB
.struts.mex 543B
.struts.mex 543B
MANIFEST.MF 36B
.mymetadata 303B
.mystrutsdata 240B
org.eclipse.wst.jsdt.ui.superType.name 6B
icon.png 4KB
icon.png 4KB
icon.png 3KB
icon.png 2KB
icon.png 2KB
icon.png 2KB
btn_style_alert_dialog_button_normal.9.png 1KB
btn_style_alert_dialog_button_normal.9.png 1KB
btn_style_alert_dialog_button_pressed.9.png 1KB
btn_style_alert_dialog_cancel_normal.9.png 1KB
btn_style_alert_dialog_special_normal.9.png 1KB
btn_style_alert_dialog_cancel_normal.9.png 1KB
btn_style_alert_dialog_special_pressed.9.png 1KB
btn_style_alert_dialog_button_pressed.9.png 1KB
btn_style_alert_dialog_special_normal.9.png 1KB
btn_style_alert_dialog_special_pressed.9.png 1KB
btn_style_alert_dialog_background.9.png 1KB
btn_style_alert_dialog_background.9.png 997B
org.eclipse.jdt.core.prefs 395B
org.eclipse.core.resources.prefs 88B
.project 2KB
.project 854B
project.properties 563B
globalMessages_zh_CN.properties 202B
globalMessages_zh_CN.properties 202B
select_pic_layout.xml 2KB
main.xml 1KB
struts.xml 1KB
struts.xml 1KB
styles.xml 1KB
web.xml 994B
AndroidManifest.xml 918B
AndroidManifest.xml 918B
btn_style_alert_dialog_special.xml 317B
btn_style_alert_dialog_button.xml 315B
btn_style_alert_dialog_cancel.xml 315B
共 105 条
- 1
- 2
资源评论
- 云云南山2015-04-22你的服务器是不是只有你开的时候才能用?
- lz20092015-04-29相当不错,已经验证代码!
- lovercjring2015-02-27直接用eclipse导入可以用么
Benzema0909
- 粉丝: 4
- 资源: 91
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功