Android4.4 WebAPI实现拍照上传功能
网上有很多关于拍照上传的实现方法,如果用新版本android去运行有可能会发现根本实现不了。主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后,getData()返回的URI没有包含真实的文件路径,而是像这样“content://com.android.providers.media.documents/document/image:1234”,以至于用传统的方式找不到图片的路径。最简单的解决办法是用intent.ACTION_PICK代替intent.ACTION_GET_CONTENT。
下面给出4.4版本后拍照上传的具体实现方法:
第一步:点击拍照按钮代码
//点击拍照 btnHeadCamera.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ IntentitCamera=newIntent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(itCamera,0); } });
第二步:保存拍照图片代码
@Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ switch(requestCode){ case0://拍照 savePhoto(data); break; } super.onActivityResult(requestCode,resultCode,data); } finalStringSAVE_PATH=Environment.getExternalStorageDirectory()+"/my_head.jpg";//拍照后保存路径//保存图片publicvoidsavePhoto(Intentit){ Bundlebundle=it.getExtras(); if(bundle!=null){ Bitmapphoto=bundle.getParcelable("data"); imgHead.setImageBitmap(photo); FilefileHead=newFile(SAVE_PATH); try{ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ if(!fileHead.getParentFile().exists()){ fileHead.getParentFile().mkdir(); } BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(fileHead)); photo.compress(Bitmap.CompressFormat.JPEG,80,bos); bos.flush(); bos.close(); }else{ Toasttoast=Toast.makeText(HeadPhotoActivity.this,"保存失败!",Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER,0,0); toast.show(); } }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }
第三步:上传图片代码
StringSERVER_URL=Config.PhotoAPI+"/UploadImage";//上传的服务端API地址btnHeadCancel.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ newThread(newRunnable(){ @Override publicvoidrun(){ Filefile=newFile(SAVE_PATH); Messagemsg=newMessage(); msg.what=0; if(file!=null){ try{ intre=ImageUtils.uploadForm(file,SERVER_URL); msg.obj=re; }catch(IOExceptionex){ msg.obj=0; Toast.makeText(HeadPhotoActivity.this,"上传失败",Toast.LENGTH_SHORT).show(); } handler.sendMessage(msg); }else{ Toast.makeText(HeadPhotoActivity.this,"找不到上传图片",Toast.LENGTH_SHORT).show(); } } }).start(); } });
finalHandlerhandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ switch(msg.what){ case0: if((int)msg.obj==1){ Toast.makeText(HeadPhotoActivity.this,"上传成功",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(HeadPhotoActivity.this,"上传失败",Toast.LENGTH_SHORT).show(); } break; } } };
/** * *@paramuploadFile *需要上传的文件 *@paramserverUrl *上传的服务器的路径 *@throwsIOException */ publicstaticintuploadForm(FileuploadFile,StringserverUrl) throwsIOException{ intre=0; StringfileName=uploadFile.getName(); StringBuildersb=newStringBuilder(); sb.append("--"+BOUNDARY+"\r\n"); sb.append("Content-Disposition:form-data;name=\""+fileName +"\";filename=\""+fileName+"\""+"\r\n"); sb.append("Content-Type:image/jpeg"+"\r\n"); sb.append("\r\n"); byte[]headerInfo=sb.toString().getBytes("UTF-8"); byte[]endInfo=("\r\n--"+BOUNDARY+"--\r\n").getBytes("UTF-8"); System.out.println(sb.toString()); URLurl=newURL(serverUrl); HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+BOUNDARY); conn.setRequestProperty("Content-Length",String .valueOf(headerInfo.length+uploadFile.length() +endInfo.length)); conn.setDoOutput(true); OutputStreamout=conn.getOutputStream(); InputStreamin=newFileInputStream(uploadFile); out.write(headerInfo); byte[]buf=newbyte[1024]; intlen; while((len=in.read(buf))!=-1) out.write(buf,0,len); out.write(endInfo); in.close(); out.close(); if(conn.getResponseCode()==200){ re=1; } returnre; }
最后给出服务端WebAPI代码:
[HttpPost] publicasyncTask<HttpResponseMessage>UploadImage() {stringfilePath="~\\UploadFiles\\Photo"; //取得文件夹 stringdir=HttpContext.Current.Server.MapPath(filePath); //如果不存在文件夹,就创建文件夹 if(!Directory.Exists(dir)) Directory.CreateDirectory(dir); if(!Request.Content.IsMimeMultipartContent("form-data")) { thrownewHttpResponseException(HttpStatusCode.UnsupportedMediaType); } varprovider=newCustomMultipartFormDataStreamProvider(dir); try { //Readtheformdata. awaitRequest.Content.ReadAsMultipartAsync(provider); foreach(MultipartFileDatafileinprovider.FileData) { //file.Headers.ContentDisposition.FileName;//上传文件前的文件名 //file.LocalFileName;//上传后的文件名 Photop=newPhoto(); p.ImgInfo=file.LocalFileName.Substring(file.LocalFileName.LastIndexOf("\\")); p.Sort="员工相册"; p.AddUser="admin"; p.AddTime=DateTime.Now; p.Url=filePath+p.ImgInfo; db.Photo.Add(p); db.SaveChanges(); } returnRequest.CreateResponse(HttpStatusCode.OK);} catch { returnRequest.CreateResponse(HttpStatusCode.BadRequest);} }
//重写上传文件名 publicclassCustomMultipartFormDataStreamProvider:MultipartFormDataStreamProvider { publicCustomMultipartFormDataStreamProvider(stringpath) :base(path) {} publicoverridestringGetLocalFileName(System.Net.Http.Headers.HttpContentHeadersheaders) { stringfileName=DateTime.Now.ToString("yyyyMMddHHmmssfff"); returnfileName+"_"+headers.ContentDisposition.FileName.Replace("\"",string.Empty);//base.GetLocalFileName(headers); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。