网上有很多关于拍照上传的实现方法,如果用新版本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(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent itCamera=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(itCamera,0);
}
});

第二步:保存拍照图片代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 0://拍照
savePhoto(data);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
   final String SAVE_PATH=Environment.getExternalStorageDirectory()+"/my_head.jpg"; //拍照后保存路径 
//保存图片
public void savePhoto(Intent it){
Bundle bundle=it.getExtras();
if(bundle!=null){
Bitmap photo = bundle.getParcelable("data");
imgHead.setImageBitmap(photo);
File fileHead=new File(SAVE_PATH);
try {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
if(!fileHead.getParentFile().exists()){
fileHead.getParentFile().mkdir();
}
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(fileHead));
photo.compress(Bitmap.CompressFormat.JPEG,80,bos);
bos.flush();
bos.close();
}else {
Toast toast = Toast.makeText(HeadPhotoActivity.this, "保存失败!", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}

第三步:上传图片代码

String SERVER_URL = Config.PhotoAPI+"/UploadImage";//上传的服务端API地址

btnHeadCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(SAVE_PATH);
Message msg = new Message();
msg.what = 0;
if(file!=null) {
try {
int re = ImageUtils.uploadForm(file, SERVER_URL);
msg.obj = re;
} catch (IOException ex) {
msg.obj = 0;
Toast.makeText(HeadPhotoActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
}
handler.sendMessage(msg);
}else {
Toast.makeText(HeadPhotoActivity.this, "找不到上传图片", Toast.LENGTH_SHORT).show();
}
}
}).start();
}
});
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
if ((int)msg.obj == 1) {
Toast.makeText(HeadPhotoActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(HeadPhotoActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
}
break;
} }
};
    /**
*
* @param uploadFile
* 需要上传的文件
* @param serverUrl
* 上传的服务器的路径
* @throws IOException
*/
public static int uploadForm(File uploadFile, String serverUrl)
throws IOException {
int re=0; String fileName = uploadFile.getName();
StringBuilder sb = new StringBuilder();
     //带上参数,可添加多个参数
     sb.append("--" + BOUNDARY + "\r\n");
        sb.append("Content-Disposition: form-data; name=\"paramName\"" + "\r\n");
        sb.append("\r\n");
sb.append("paramValue" + "\r\n");
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());
URL url = new URL(serverUrl);
HttpURLConnection conn = (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); OutputStream out = conn.getOutputStream();
InputStream in = new FileInputStream(uploadFile);
out.write(headerInfo); byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1)
out.write(buf, 0, len); out.write(endInfo);
in.close();
out.close();
if (conn.getResponseCode() == 200) {
re=1;
}
return re;
}

最后给出服务端WebAPI代码:

        [HttpPost]
public async Task<HttpResponseMessage> UploadImage()
{
string filePath = "~\\UploadFiles\\Photo";
// 取得文件夹
string dir = HttpContext.Current.Server.MapPath(filePath);
//如果不存在文件夹,就创建文件夹
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new CustomMultipartFormDataStreamProvider(dir);
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
foreach (MultipartFileData file in provider.FileData)
{
//file.Headers.ContentDisposition.FileName;//上传文件前的文件名
//file.LocalFileName;//上传后的文件名
Photo p = new Photo();
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();
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
    //重写上传文件名
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path)
: base(path)
{ } public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
{
string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
return fileName + "_" + headers.ContentDisposition.FileName.Replace("\"", string.Empty);//base.GetLocalFileName(headers);
}
}

Android4.4 + WebAPI 实现拍照上传的更多相关文章

  1. iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案

    问题描述: 手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题. 并且照片竖怕才会有此问题,横拍不存在. 原因分析: 手机拍照时,用相机拍摄出来 ...

  2. html5调用手机摄像头,实现拍照上传功能

    今天做手机网站,想实现手机扫描二维码功能.首先实现在浏览器中调用手机摄像头,实现拍照功能并且把拍下的照片显示在页面并上传到服务器上,然后再在服务器端进行分析. 首先实现在浏览器中调用摄像头,当然用现在 ...

  3. 【Demo】HTML5 拍照上传

    本文主要讲解 手机浏览器 如何拍照 为什么会有这个需求 最近做一个项目要用到拍照然后上传照片,但是网页拍照一般都是用Flash做的,而我们主要是H5页面,如果在微信里面有权限就可以通过JSSDK调起摄 ...

  4. php实现手机拍照上传头像功能

    现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ...

  5. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  6. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)[转]

    IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)   目前最流行的跨平台交互是采用http协议通过JSON对象进行互操作.这种方式最简单,也很高效.webservi ...

  7. webAPP如何实现移动端拍照上传(Vue组件示例)?

    摘要:使用HTML5编写移动Web应用,主要是为了尝试一下“一套代码多处运行”,一个webapp几乎可以不加修改的运行在PC/Android/iOS等上面运行.但是写到现在觉得虽然这种方式弊大于利,不 ...

  8. HTML5手机端拍照上传

    1.accept="image/*" capture="camera" 自动调用手机端拍照功能 accept="image/*" captu ...

  9. 关于plupload组件无法拍照上传的解决方案

    关于plupload组件无法拍照上传的解决方案 其实是由于文件大小的问题 filters: { max_file_size: '2mb',//把这个调大些就可以了 前提是服务器支持 prevent_d ...

随机推荐

  1. js判断checkbox是否已选

    代码: <h2>Default</h2> @using (Html.BeginForm()) { <ul> <li>@Html.CheckBox(&qu ...

  2. 如何将域中的AD数据导入SharePoint

    转:http://www.cnblogs.com/wallis0922/archive/2010/09/29/1838292.html 最近刚装好sharepoint2010,想要研究一下,第一件想做 ...

  3. 转换Json格式帮助类

    using System; using System.Collections.Generic; using System.Text; using System.Reflection; using Sy ...

  4. C# 创建WebServices及调用方法

    发布WebServices 1.创建  ASP.NET Web 服务应用程序 SayHelloWebServices 这里需要说明一下,由于.NET Framework4.0取消了WebService ...

  5. sonar之安装篇

    sonar 是一个很好的质量度量平台,安装方式有很多种.下面我教大家使用j2ee 容器的方式安装,我们使用tomcat 1.准备: 1.1 环境redhat linux1.2 下载sonar 从htt ...

  6. flappy pig小游戏源码分析(3)——解剖util

    这一节我们继续高歌猛进,如果对源码中有无论无何都理解不通的问题,欢迎和我交流,让我也学习一下,我的qq是372402487. 还是按照惯例看看我们的目录结构. 我们在前两节中已经分析了game.js, ...

  7. 转载 SharePoint【Site Definition 系列】– 创建Content Type

    转载原地址:  http://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html Sharepoint本身就是一个丰富的大容器,里面 ...

  8. FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】

    eMbPoll()的作用是FreeMod协议通信过程中不断查询事件对列有无完速数据桢,并进行地址和CRD验证,最后运行和回复主机. 为了减小代码尺寸对eMbPoll进行改进: 原版: 1:  2: e ...

  9. 使用Redis bitmaps进行快速、简单、实时统计

    原文:Fast, easy, realtime metrics using Redis bitmaps (http://blog.getspool.com/2011/11/29/fast-easy-r ...

  10. hdu 1520 (树形DP)

    dp[i][0]表示i不参加 dp[i][1]表示i参加 简单的树形dp #include<stdio.h> #include<string.h> #define N 6100 ...