




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能
這篇文章將為大家詳細講解有關Android如何實現(xiàn)頭像上傳功能,在下覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。效果圖首先看上傳圖片的工具類,一點都沒有少復制就可以用**
*
Created
by
Administrator
on
2016/7/28.
*
上傳圖片工具類
*/
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";
//
內(nèi)容類型
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
在網(wǎng)頁上<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
在網(wǎng)頁上<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
=
"";
/***
*
以下是用于上傳參數(shù)
*/
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);
}
String
s
=
sb1.toString();
result
=
s;
Log.e(TAG,
"result
:
"
+
result);
sendMessage(UPLOAD_SUCCESS_CODE,
"上傳結(jié)果:"
+
result);
return;
}
else
{
Log.e(TAG,
"request
error"
+
res);
sendMessage(UPLOAD_SERVER_ERROR_CODE,
"上傳失?。篶ode="
+
res);
return;
}
}
catch
(MalformedURLException
e)
{
sendMessage(UPLOAD_SERVER_ERROR_CODE,
"上傳失?。篹rror="
+
e.getMessage());
e.printStackTrace();
return;
}
catch
(IOException
e)
{
sendMessage(UPLOAD_SERVER_ERROR_CODE,
"上傳失?。篹rror="
+
e.getMessage());
e.printStackTrace();
return;
}
}
/**
*
發(fā)送上傳結(jié)果
*
*
@param
responseCode
*
@param
responseMessage
*/
private
void
sendMessage(int
responseCode,
String
responseMessage)
{
onUploadProcessListener.onUploadDone(responseCode,
responseMessage);
}
/**
*
下面是一個自定義的回調(diào)函數(shù),用到回調(diào)上傳文件是否完成
*
*
@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
{
}
/**
*
將Bitmap轉(zhuǎn)換成文件
*
保存文件
*
*
@param
bm
*
@param
fileName
*
@throws
IOException
*/
public
static
File
saveFile(Bitmap
bm,
String
path,
String
fileName)
throws
IOException
{
File
dirFile
=
new
File(path);
if
(!dirFile.exists())
{
dirFile.mkdir();
}
File
myCaptureFile
=
new
File(path,
fileName);
BufferedOutputStream
bos
=
new
BufferedOutputStream(new
FileOutputStream(myCaptureFile));
press(Bitmap.CompressFormat.JPEG,
80,
bos);
bos.flush();
bos.close();
return
myCaptureFile;
}
}從相冊獲取圖片的方法/**
*
從相冊選擇圖片來源
*/
private
void
getPhoto()
{
Intent
intent
=
new
Intent(Intent.ACTION_PICK,
vider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent,
PHOTO_REQUEST);
}從系統(tǒng)相機拍照獲取照片/**
*
從系統(tǒng)相機選擇圖片來源
*/
private
void
getCamera()
{
Intent
intent
=
new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//
下面這句指定調(diào)用相機拍照后的照片存儲的路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new
File(
Environment.getExternalStorageDirectory(),
"hand.jpg")));
startActivityForResult(intent,
CAMERA_REQUEST);
}調(diào)用系統(tǒng)裁剪工具裁剪圖片/****
*
調(diào)用系統(tǒng)自帶切圖工具對圖片進行裁剪
*
微信也是
*
*
@param
uri
*/
private
void
photoClip(Uri
uri)
{
//
調(diào)用系統(tǒng)中自帶的圖片剪裁
Intent
intent
=
new
Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri,
"image/*");
//
下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪
intent.putExtra("crop",
"true");
//
aspectX
aspectY
是寬高的比例
intent.putExtra("aspectX",
1);
intent.putExtra("aspectY",
1);
//
outputX
outputY
是裁剪圖片寬高
intent.putExtra("outputX",
150);
intent.putExtra("outputY",
150);
intent.putExtra("return-data",
true);
startActivityForResult(intent,
PHOTO_CLIP);
}上傳服務器的方法/**
*
上傳圖片到服務器
*/
private
void
toUploadFile()
{
pd
=
ProgressDialog.show(this,
"",
"正在上傳文件...");
pd.show();
String
fileKey
=
"avatarFile";
UploadUtil
uploadUtil
=
UploadUtil.getInstance();
uploadUtil.setOnUploadProcessListener(MainActivity.this);
//設置監(jiān)聽器監(jiān)聽上傳狀態(tài)
Map<String,
String>
params
=
new
HashMap<String,
String>();//上傳map對象
params.put("userId",
"");
uploadUtil.uploadFile(filepath,
fileKey,
"上傳頭像的地址",
params);
Toast.makeText(this,
"上傳成功",
Toast.LENGTH_LONG).show();
}重新服務器響應方法/**
*
上傳服務器響應回調(diào)
*/
@Override
public
void
onUploadDone(int
responseCode,
String
message)
{
//上傳完成響應
pd.dismiss();
Message
msg
=
Message.obtain();
msg.what
=
UPLOAD_FILE_DONE;
msg.arg1
=
responseCode;
msg.obj
=
message;
}
@Override
public
void
onUploadProcess(int
uploadSize)
{
//上傳中
Message
msg
=
Message.obtain();
msg.what
=
UPLOAD_IN_PROCESS;
msg.arg1
=
uploadSize;
}
@Override
public
void
initUpload(int
fileSize)
{
//準備上傳
Message
msg
=
Message.obtain();
msg.what
=
UPLOAD_INIT_PROCESS;
msg.arg1
=
fileSize;
}重寫這些方法需要實現(xiàn)接口public
class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener,
Uploa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 井控復習測試卷
- SQL數(shù)據(jù)庫復習試題
- 大寒節(jié)氣與古農(nóng)業(yè)
- 土地出租合同范本模板
- 商場攤位租金合同范本
- 合伙開采玉礦合同范本
- 加工鑄造用工合同范本
- 吊籃安拆合同范本
- 傳媒助力校園綠化
- 醫(yī)療設備推廣合同范本
- 2023年10月自考試題00840第二外語(日語)
- 農(nóng)產(chǎn)品市場營銷中的市場競爭分析
- 了解滑雪:滑雪器材與滑雪的技巧
- 報價單模板完
- 【某醫(yī)療美容機構(gòu)營銷策略現(xiàn)狀、問題及優(yōu)化建議分析6300字】
- 關于外委單位工作情況的報告
- PIVAS靜配中心清潔消毒規(guī)范
- 現(xiàn)場問題整改清單匯總
- 第三章交強險課件
- 項目后評價表格(全過程咨詢)
- 公務員面試真題之材料題有解析有材料
評論
0/150
提交評論