图片上传之前要进行压缩
private void uploadPic (final String filestr, Bitmap bm) {
bitmap = bm;
dialog .show();
// String fileKey = "pic";
// UploadUtil uploadUtil = UploadUtil.getInstance();
// uploadUtil.setOnUploadProcessListener(this); // 设置监听器监听上传状态
// Map params = new HashMap();
//// params.put("orderId", "11111");
// uploadUtil.uploadFile(filestr, fileKey, urlpic, params);
File file = new File(filestr);
uploadFileInThreadByOkHttp(file);
}
// 压缩图片并上传
private void uploadFileInThreadByOkHttp (final File tempPic) {
final String pic_path = tempPic.getPath();
String targetPath = Environment.getExternalStorageDirectory ().getPath() +File.separator + "compressPic.jpg" ;
final String compressImage = compressImage (pic_path, targetPath, 30 );
final File compressedPic = new File(compressImage);
if (compressedPic.exists()) {
LogUtils.LOGI ("tag" , " 图片压缩上传 " );
String fileKey = "pic" ;
UploadUtil uploadUtil = UploadUtil.getInstance ();
uploadUtil.setOnUploadProcessListener(this ); // 设置监听器监听上传状态
Map, String> params = new HashMap, String>();
uploadUtil.uploadFile(compressedPic, "pic" , urlpic , params);
}
}
public static String compressImage (String filePath, String targetPath, int quality) {
Bitmap bm = getSmallBitmap (filePath);
// 旋转照片角度,省略
/*int degree = readPictureDegree(filePath);
if(degree!=0){
bm=rotateBitmap(bm,degree);
}*/
File outputFile = new File(targetPath);
try {
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs();
//outputFile.createNewFile();
} else {
outputFile.delete();
}
FileOutputStream out = new FileOutputStream(outputFile);
bm.compress(Bitmap.CompressFormat.JPEG , quality, out);
} catch (Exception e) {
}
return outputFile.getPath();
}
/**
* 根据路径获得突破并压缩返回 bitmap 用于显示
*/
public static Bitmap getSmallBitmap (String filePath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 只解析图片边沿,获取宽高
BitmapFactory.decodeFile (filePath, options);
// 计算缩放比
int w = options.outWidth ;
int h = options.outHeight ;
float hh = 800f ; // 这里设置高度为 800f
float ww = 480f ; // 这里设置宽度为 480f
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1 ; // be=1 表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int ) (options.outWidth / ww);
} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
be = (int ) (options.outHeight / hh);
}
if (be <= 0 )
be = 1 ;
options.inSampleSize = be;
// 完整解析图片返回 bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile (filePath, options);
}
/**
* 上传工具类
*
* @author spring sky
* Email :[email protected]
* QQ: 840950105
* 支持上传文件和参数
*/
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 = 100 * 1000 ; // 读取超时
private int connectTimeout = 100 * 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 在网页上 xxx 就是这里的 fileKey
* @param RequestURL 请求的 URL
*/
public void uploadFile(String filePath, String fileKey, String RequestURL,
Map, 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 在网页上 xxx 就是这里的 fileKey
* @param RequestURL 请求的 URL
*/
public void uploadFile (final File file, final String fileKey,
final String RequestURL, final Map, 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> 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 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);
}
/**
* 下面是一个自定义的回调函数,用到回调上传文件是否完成
*
* @author shimingzheng
*/
public static interface OnUploadProcessListener {
/**
* 上传响应
*
* @param responseCode
* @param message
*/
void onUploadDone(int responseCode, String message);
/**
* 上传中
*
* @param uploadSize
*/
void onUploadProcess(int uploadSize);
/**
* 准备上传
*
* @param fileSize
*/
void initUpload(int fileSize);
}
private OnUploadProcessListener onUploadProcessListener;
public void setOnUploadProcessListener(
OnUploadProcessListener onUploadProcessListener) {
this .onUploadProcessListener = onUploadProcessListener;
}
public int getReadTimeOut() {
return readTimeOut;
}
public void setReadTimeOut(int readTimeOut) {
this .readTimeOut = readTimeOut;
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(int connectTimeout) {
this .connectTimeout = connectTimeout;
}
/**
* 获取上传使用的时间
*
* @return
*/
public static int getRequestTime() {
return requestTime;
}
public static interface uploadProcessListener {
}
}