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(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=\"" + 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);
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android使用Retrofit仿微信多张图片拍照上传

    Android 仿照微信发说说,既能实现拍照,选图库,多图案上传,使用Retrofit技术. 使用方法:详见http://www.jb51.net/article/103009.htm 项目的运行效果: 服务器端接收文件的action UploadFile.java @Controller public class UploadFile extends ActionSupport { /** * */ private static final long serialVersionUID = 1L

  • Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换的库,同时支持图片删除的库,效果类似微信. (1) 添加PhotoPicker的架包 (2) 使用 选择图片:安卓6.0以后需要在代码中添加读写sd卡和相机的权限 当然清单文件中也需要添加的 PhotoPicker.builder() .setPhotoCount(maxPhoto)

  • Android拍照上传功能示例代码

    本文实例讲述了Android实现拍照上传功能的方法.分享给大家供大家参考,具体如下: 1.LoginWindow.java --登录窗口 package com.hemi.rhet; import com.hemi.rhet.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; import android.vie

  • Android4.4 WebAPI实现拍照上传功能

    网上有很多关于拍照上传的实现方法,如果用新版本android去运行有可能会发现根本实现不了.主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后,getData()返回的URI没有包含真实的文件路径,而是像这样"content://com.android.providers.media.documents/document/image:1234",以至于用传统的方式找不到图片的路径.最简单的解决办法是用intent.ACTION_P

  • js实现手机拍照上传功能

    在前段时间的项目开发中,用到了拍照上传的地方,后来发现了最为简单的一种方法,现总结如下: <form id="form" method="post" action="http://192.168.1.131:8080/task/add" enctype="multipart/form-data"> <input id="input-file" type="file" a

  • vue实现pc端拍照上传功能

    本文实例为大家分享了vue实现pc端拍照上传功能的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF8"> </head> <body> <div id="contentHolder"> <video id="video" width="320" heigh

  • php视频拍照上传头像功能实现代码分享

    如果要在php中实现视频拍照我们需要借助于flash插件了,由flash拍出的确照片我们再通过php的$GLOBALS ['HTTP_RAW_POST_DATA']接受数据,然后保存成图片就可以了,下面我来介绍一下. 使用的是$GLOBALS ['HTTP_RAW_POST_DATA'],这个系统函数跟post很相似,但是$GLOBALS ['HTTP_RAW_POST_DATA']支持的数据格式更丰富些. 设计流程: $GLOBALS ['HTTP_RAW_POST_DATA']传递照片数据流

  • 微信小程序基于腾讯云对象存储的图片上传功能

    在使用腾讯云对象存储之前,公司一直使用的是传统的FTP的上传模式,而随着用户量的不断增加,FTP所暴露出来的问题也越来越多,1.传输效率低,上传速度慢.2.时常有上传其他文件来攻击服务器,安全上得不到保障.所以我们在经过慎重考虑觉得使用第三方的云存储服务. 在最开始的时候我们在腾讯云与阿里云中选择,最终我们选择腾讯云,腾讯云在文件上传用时方面的性能比较突出,文件越大表现越好:在下载用时方面表现略优于阿里云:文件删除用时方面总体速度略逊于,但在不同大小文件删除用时上都比较稳定.当然这与我们主要用于

  • Vue vant-ui使用van-uploader实现头像上传功能

    效果图: 项目中是使用有赞vant-ui框架实现的头像上传替换功能 代码布局结构: <van-row class="sendInfo"> <van-col span="24" class="flex colorf topInfo p20"> <!--左边头像部分--> <van-uploader :after-read="afterCard" :before-read="be

  • Electron调用外接摄像头并拍照上传实现详解

    目录 背景 需求分析 实现 视频采集 MediaDevices.getUserMedia() 拍照生成图片 上传图片至CDN 1. 使用HTMLCanvasElement.toBlob() 语法 参数 2. 使用HTMLCanvasElement.toDataURL() 语法 参数 返回值 总结 背景 基于Electron实现的pc端智能验机应用,近期迭代了一个新的功能,需求是通过电脑外接摄像头对手机屏幕进行拍照,拍照后需将照片上传至服务端进行屏幕信息比对,确定被检测屏幕是否为原厂屏. 需求分析

  • AjaxFileUpload+Struts2实现多文件上传功能

    本文重点给大家介绍AjaxFileUpload+Struts2实现多文件上传功能,具体实现代码大家参考下本文. 单文件和多文件的实现区别主要修改两点, 一是插件ajaxfileupload.js里接收file文件ID的方式 二是后台action是数组形式接收 1.ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ 2.引入jquery-1.8.0.min.js.ajaxFileUpload.js文件 3.文

  • Ajax 配合node js multer 实现文件上传功能

    说明 作为一个node 初学者,最近在做一个聊天软件,支持注册.登录.在线单人.多人聊天.表情发送.各种文件上传下载.增删好友.聊天记录保存.通知声开关.背景图片切换.游戏等功能,所以用到了multer 模块,经过各种查文档,做demo例子,终于成功实现单个文件上传功能,支持大部分文件格式上传,同时显示到网页上 效果 是不是有种微信即视感,没错,就是根据网页版微信来做的, 要实现整体效果的话,要配合css和html来做,前端初学者,第一次发博客,实在捉急,近期,将会将代码放到github上去,感

随机推荐