Android应用开发中webview上传文件的几种思路

1. 常规方法,重写WebChromeClient 的 openFileChooser 方法

private class MyWebChromeClient extends WebChromeClient {
        // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
               if (mUploadMessage != null) return;
               mUploadMessage = uploadMsg;
               Intent i = new Intent(Intent.ACTION_GET_CONTENT);
               i.addCategory(Intent.CATEGORY_OPENABLE);
               i.setType("*/*");

                   startActivityForResult( Intent.createChooser( i, "File Chooser" ), 1 );
         }
            // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
               openFileChooser( uploadMsg, "" );
        }
     // For Android  > 4.1.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
        {
            openFileChooser(uploadMsg, acceptType);
        }

    }

这个是大家常用的,但是这个openFileChooser不是公开的方法,android4.4 不支持,肿么办?判断版本,如果是4.4就调用系统浏览器是个变通的方法,到时可以用,但是客户不认可,只有自己用app自己实现上传了。

2. 自己实现上传

private String post(String pathToOurFile) throws ClientProtocolException, IOException, JSONException {
          HttpClient httpclient = new DefaultHttpClient();
          //设置通信协议版本
          httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

          HttpPost httppost = new HttpPost(uploadUrl);
          File file = new File(pathToOurFile);

          MultipartEntity mpEntity = new MultipartEntity(); //文件传输
          ContentBody cbFile = new FileBody(file);
          mpEntity.addPart("userfile", cbFile); // <input type="file" name="userfile" />  对应的

          httppost.setEntity(mpEntity);

          HttpResponse response = httpclient.execute(httppost);
          HttpEntity resEntity = response.getEntity();

          String json="";
          String path="";
          if (resEntity != null) {
            json=EntityUtils.toString(resEntity,"utf-8");
            JSONObject p=null;
            try{
                p=new JSONObject(json);
                path=(String) p.get("path");
            }catch(Exception e){
                e.printStackTrace();
            }
          }
          if (resEntity != null) {
            resEntity.consumeContent();
          }

          httpclient.getConnectionManager().shutdown();
          return path;
      }

用到了 httpmine包,网上有下载。

如何调用呢?

browser.addJavascriptInterface(this, "android"); browser是webview对象。

在页面<a href="javascrijpt:window.android.uploadFile()">上传文件</a>

uploadFile() 是被调用的Activity的一个方法,主要就是打开选择对话框,流程和第一种方法一样。只是返回文件路径后自己上传。

新版android系统到是可以了,又出现了问题:在android2.3等版本有个bug,从js调用app的方法会崩溃,不兼容,我们只能换一种方法调用这个uploadFile

另外编译的时候最好选择2.2版本,不要选择2.3

3. 过滤url, 重写 WebViewClient的 shouldOverrideUrlLoading方法

private class MyWebViewClient extends WebViewClient{
          private Context mContext;
          public MyWebViewClient(Context context){
           super();
           mContext = context;
          }

          public boolean shouldOverrideUrlLoading(WebView view, String url)
          {
              if (url.equalsIgnoreCase("app:upload")) {
                  MainActivity.this.uploadFile();
                  return true;
              }
              view.loadUrl(url);
              return true;
          }
         }  

页面中 <a href="app:upload">上传文件</a>

Android 的兼容性问题真让人头疼啊 --

时间: 2024-09-30 14:49:48

Android应用开发中webview上传文件的几种思路的相关文章

java开发中截取上传文件的文件名和后缀名

java开发中截取上传文件的文件名和后缀名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String f

使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到

使用Mvc里的插件jquery.unobtrusive-ajax.min.js 之前一直困在这里,一开始以为添加属性enctype="multipart/form-data"就可以 网上看到都是用另外一个插件jquery.form.js 于是,从某篇文章的附件中下载了jquery.form.js,弄了许久,还不行,顿时泪崩了, 最后在官网下载最新的jquery.form.js就解决了  ==|| 使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到

asp.net中fileupload上传文件的方法

FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles\test.txt)来指定要上载的文件.用户也可以通过单击“浏览”按钮,然后在“选择文件”对话框中定位文件来选择文件. 用户选择要上载的文件后,FileUpload 控件不会自动将该文件保存到服务器.您必须显式提供一个控件或机制,使用户能提交指定的文件.例如,可以提供一个按钮,用户单击它即可上载文件

MVC中如何上传文件

本文导读:在MVC中实现文件上传与传统的WebForm上传文件方法都差不多,在cshtml视图页面放一个file标签,然后在actionname方法中处理用户上传的文件.下面简单介绍MVC中上传文件的方法. 一.MVC中如何上传文件 1.在Web Forms中,当你把一个FileUpload控件拖到设计器中,你或许没有注意到在生成的HTML中会在form标签中加入一条额外属性 enctype="multipart/form-data". 而FileUpload控件本身会生成为<i

ASP.NET上传文件的几种方法

//上传文件实例 if (fileDealer.HasFile)//判断文件是否存在        {            string filepath = "";            try            {                string path = fileDealer.FileName;                string filename = path.Split('.')[0] + "_" + DateTime.Now

小程序云开发--云函数上传文件或图片 base64

云函数开发遇到的问题 在微信云开发环境当中,普通的用户并没有往云存储内写入文件的权限 所以普通用户想要使用wx.cloud.uploadFile显然是不现实的 但是我们同时也知道,云函数是后台服务端,具有管理员权限,只要能调用云函数上传文件就可以解决这个问题了 参照官方文档中云函数的写法 const cloud = require('wx-server-sdk') const fs = require('fs') const path = require('path') exports.main

SpringMvc (注解)中的上传文件

第一步:导入commons-fileupload-1.3.1.jar 和commons-io-2.2.jar 架包 第二步:在applicationContext.xml中 配置 <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”/> 第三步:在页面 <form>标签添加属性enctype=”multipart/form-dat

【springmvc】springmvc中如何上传文件

使用到的组件:可自行根据情况选择版本 <!--上传依赖包--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <!--commons-upload依赖包begin-->

Android通过HTTP协议实现上传文件数据

SocketHttpRequester.java package cn.itcast.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import