你的位置:首页 > 操作系统

[操作系统]Android实现表单提交,webapi接收


1.服务端采用的是.net的WEBAPI接口。

2.android多文件上传。

以下为核心代码:

 1 package com.example.my.androidupload; 2  3  4 import android.util.Log; 5  6 import java.io.File; 7 import java.io.Serializable; 8 import java.util.Iterator; 9 import java.util.LinkedHashMap; 10 import java.util.Map; 11 import java.util.Map.Entry; 12  13 import org.apache.http.Consts; 14 import org.apache.http.HttpEntity; 15 import org.apache.http.HttpResponse; 16 import org.apache.http.client.HttpClient; 17 import org.apache.http.client.methods.HttpPost; 18 import org.apache.http.entity.ContentType; 19 import org.apache.http.entity.mime.MultipartEntityBuilder; 20 import org.apache.http.entity.mime.content.FileBody; 21 import org.apache.http.entity.mime.content.StringBody; 22 import org.apache.http.impl.client.DefaultHttpClient; 23 import org.apache.http.util.EntityUtils; 24  25 /** 26  * Created by wz on 2016/04/19. 27 */ 28 public class HttpClientUtil { 29   public final static String Method_POST = "POST"; 30   public final static String Method_GET = "GET"; 31  32   /** 33    * multipart/form-data类型的表单提交 34    * 35    * @param form 表单数据 36   */ 37   public static String submitForm(MultipartForm form) { 38     // 返回字符串 39     String responseStr = ""; 40  41     // 创建HttpClient实例 42 /*    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); 43     CloseableHttpClient httpClient = httpClientBuilder.build();*/ 44     // CloseableHttpClient httpClient= HttpClients.createDefault(); 45  46     HttpClient httpClient = new DefaultHttpClient(); 47     try { 48       // 实例化提交请求 49       HttpPost httpPost = new HttpPost(form.getAction()); 50  51       // 创建MultipartEntityBuilder 52       MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 53  54       Log.e("HttpClientUtil", "111"); 55       // 追加普通表单字段 56       Map<String, String> normalFieldMap = form.getNormalField(); 57       for (Iterator<Entry<String, String>> iterator = normalFieldMap.entrySet().iterator(); iterator.hasNext(); ) { 58         Entry<String, String> entity = iterator.next(); 59         entityBuilder.addPart(entity.getKey(), new StringBody(entity.getValue(), ContentType.create("text/plain", Consts.UTF_8))); 60       } 61       Log.e("HttpClientUtil", "222"); 62       // 追加文件字段 63       Map<String, File> fileFieldMap = form.getFileField(); 64       for (Iterator<Entry<String, File>> iterator = fileFieldMap.entrySet().iterator(); iterator.hasNext(); ) { 65         Entry<String, File> entity = iterator.next(); 66         entityBuilder.addPart(entity.getKey(), new FileBody(entity.getValue())); 67       } 68       Log.e("HttpClientUtil", "333"); 69       // 设置请求实体 70       httpPost.setEntity(entityBuilder.build()); 71       Log.e("HttpClientUtil", "444"); 72       // 发送请求 73       HttpResponse response = httpClient.execute(httpPost); 74       int statusCode = response.getStatusLine().getStatusCode(); 75       // 取得响应数据 76       HttpEntity resEntity = response.getEntity(); 77       Log.e("HttpClientUtil", "结果:" + Integer.toString(statusCode)); 78       if (200 == statusCode) { 79         if (resEntity != null) { 80           responseStr = EntityUtils.toString(resEntity); 81         } 82       } 83     } catch (Exception e) { 84       System.out.println("提交表单失败,原因:" + e.getMessage()); 85     } finally { 86       try { 87         httpClient.getConnectionManager().shutdown(); 88       } catch (Exception ex) { 89       } 90     } 91     return responseStr; 92   } 93  94   /** 95    * 表单字段Bean 96   */ 97   public class MultipartForm implements Serializable { 98     /** 99      * 序列号100     */101     private static final long serialVersionUID = -2138044819190537198L;102 103     /**104      * 提交URL105      **/106     private String action = "";107 108     /**109      * 提交方式:POST/GET110      **/111     private String method = "POST";112 113     /**114      * 普通表单字段115      **/116     private Map<String, String> normalField = new LinkedHashMap<String, String>();117 118     /**119      * 文件字段120      **/121     private Map<String, File> fileField = new LinkedHashMap<String, File>();122 123     public String getAction() {124       return action;125     }126 127     public void setAction(String action) {128       this.action = action;129     }130 131     public String getMethod() {132       return method;133     }134 135     public void setMethod(String method) {136       this.method = method;137     }138 139     public Map<String, String> getNormalField() {140       return normalField;141     }142 143     public void setNormalField(Map<String, String> normalField) {144       this.normalField = normalField;145     }146 147     public Map<String, File> getFileField() {148       return fileField;149     }150 151     public void setFileField(Map<String, File> fileField) {152       this.fileField = fileField;153     }154 155     public void addFileField(String key, File value) {156       fileField.put(key, value);157     }158 159     public void addNormalField(String key, String value) {160       normalField.put(key, value);161     }162   }163 164 165 }

调用:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {  private Button mBtnUpload;  @Override  public void onClick(View v) {    switch (v.getId()) {      case R.id.btn_upload: {        new Thread(new Runnable() {          @Override          public void run() {            HttpClientUtil httpClient = new HttpClientUtil();            HttpClientUtil.MultipartForm form = httpClient.new MultipartForm();            //设置form属性、参数            form.setAction("http://192.168.1.5:9001/api/Mobile/FileUpload/UploadFile");            String path= Environment.getExternalStorageDirectory().getPath()+"/DCIM" + "/20151120_051052.jpg";            Log.e("11", path);            File file = new File(path);            form.addFileField("file", file);            form.addNormalField("ID", "301201604");            String resultcode = httpClient.submitForm(form);            Log.e("上传结果:",resultcode);          }        }).start();        break;      }    }  }  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mBtnUpload = (Button) findViewById(R.id.btn_upload);    mBtnUpload.setOnClickListener(this);  }}

服务端代码(由.net WEBAPI开发):

 1   /// <summary> 2   /// 附件上传 3   /// </summary> 4   [RoutePrefix("api/Mobile/FileUpload")] 5   public class FileUploadController : ApiController 6   { 7     static readonly string UploadFolder = "/UpLoad/ApiUpload"; 8     static readonly string ServerUploadFolder = HttpContext.Current.Server.MapPath(UploadFolder); 9  10  11     #region 上传文件-文件信息不保存到数据库 12     /// <summary> 13     /// 上传文件-文件信息不保存到数据库 14     /// </summary> 15     /// <returns>返回文件信息</returns> 16     [HttpPost] 17     [Route("UploadFile")] 18     public async Task<List<FileResultDTO>> UploadFile() 19     { 20       Log.Info("UploadFile", "进入"); 21  22       // 验证这是一个HTML表单文件上传请求 23       if (!Request.Content.IsMimeMultipartContent("form-data")) 24       { 25         Log.Info("UploadFile", "error01"); 26         throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType)); 27       } 28  29  30       // Create a stream provider for setting up output streams 31       MultipartFormDataStreamProvider streamProvider = new RenamingMultipartFormDataStreamProvider(ServerUploadFolder); 32       // Read the MIME multipart asynchronously content using the stream provider we just created. 33       await Request.Content.ReadAsMultipartAsync(streamProvider); 34       Log.Info("UploadFile", "进入01"); 35       List<FileResultDTO> itemList = new List<FileResultDTO>(); 36       foreach (MultipartFileData file in streamProvider.FileData) 37       { 38         Log.Info("UploadFile", "进入02"); 39  40         FileInfo fileInfo = new FileInfo(file.LocalFileName); 41  42         FileResultDTO item = new FileResultDTO(); 43         var sLocalFileName = file.LocalFileName; 44         string fileName = sLocalFileName.Substring(sLocalFileName.LastIndexOf("\\") + 1, sLocalFileName.Length - sLocalFileName.LastIndexOf("\\") - 1); 45  46         item.ID = Guid.NewGuid(); 47         item.FileName = file.Headers.ContentDisposition.FileName; 48         item.ServerFileName = fileInfo.Name; 49         item.FileSize = fileInfo.Length; 50         item.FilePath = UploadFolder; 51         item.FullFilePath = ServerUploadFolder; 52         item.ContentType = file.Headers.ContentType.MediaType.ToString(); 53         item.UploadTime = DateTime.Now; 54  55         itemList.Add(item); 56       } 57       Log.Info("UploadFile", "进入03"); 58       return itemList; 59     } 60     #endregion 61  62     #region 上传文件-文件信息会保存到数据库 63  64     /// <summary> 65     /// 上传文件-文件信息会保存到数据库 66     /// </summary> 67     /// <returns></returns> 68     [HttpPost] 69     [Route("UploadFileToServer")] 70     public IHttpActionResult UploadFileToServer() 71     { 72       //验证是否是 multipart/form-data 73       if (!Request.Content.IsMimeMultipartContent("form-data")) 74       { 75         throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType)); 76       } 77  78       List<AttachmentDTO> list = new List<AttachmentDTO>(); 79       string devId = ""; 80       for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++) 81       { 82         HttpPostedFile file = HttpContext.Current.Request.Files[i]; 83  84         string sFileName = "ST_M_" + Guid.NewGuid() + System.IO.Path.GetExtension(file.FileName); 85         string path = AppDomain.CurrentDomain.BaseDirectory + ServerUploadFolder + "/"; 86  87         file.SaveAs(Path.Combine(path, sFileName)); 88  89         AttachmentDTO entity = new AttachmentDTO(); 90         devId = HttpContext.Current.Request["DevId"].ToString(); 91         string ForeignID = HttpContext.Current.Request["ForeignID"].ToString(); 92  93         entity.ForeignID = ForeignID; 94         entity.FileName = sFileName; 95         entity.FilePath = ServerUploadFolder; 96         entity.UploadTime = DateTime.Now; 97         entity.ContentType = file.ContentType; 98         entity.FileSize = file.ContentLength; 99         entity.CreatedTime = DateTime.Now;100 101         list.Add(entity);102       }103 104       MobileBL.GetInstance().InsertAttachment(devId, list);105       return Ok(true);106     }107     #endregion108   }109   public class RenamingMultipartFormDataStreamProvider : MultipartFormDataStreamProvider110   {111     public string Root { get; set; }112     //public Func<FileUpload.PostedFile, string> OnGetLocalFileName { get; set; }113 114     public RenamingMultipartFormDataStreamProvider(string root)115       : base(root)116     {117       Root = root;118     }119 120     public override string GetLocalFileName(HttpContentHeaders headers)121     {122       string filePath = headers.ContentDisposition.FileName;123 124       // Multipart requests with the file name seem to always include quotes.125       if (filePath.StartsWith(@"""") && filePath.EndsWith(@""""))126         filePath = filePath.Substring(1, filePath.Length - 2);127 128       var filename = Path.GetFileName(filePath);129       var extension = Path.GetExtension(filePath);130       var contentType = headers.ContentType.MediaType;131 132       return "ST_M_" + Guid.NewGuid() + extension;133     }134 135   }

Android Studiod代码下载:点击下载

参考:http://www.cnblogs.com/fly100/articles/3492525.html