編輯:關於android開發
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 * 提交URL 105 **/ 106 private String action = ""; 107 108 /** 109 * 提交方式:POST/GET 110 **/ 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 #endregion 108 } 109 public class RenamingMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 110 { 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
Android studio1.5.1 NDK配置開發 注意:因為使用的工具和SDK版本不同,過程可能就不同,我把我試驗過的幾種情況都會說下。 一、工具和SDK版本:An
Android 巧妙實現圖片和文字上下布局或者左右布局,最近去了一家新公司,然後開始做新的項目,看其代碼發現了一個很巧妙的方法來實現圖片在上面文字在下面的布局方式。只需要
Android下創建一個SQLite數據庫,androidsqlite數據庫:SQLite(輕量級,嵌入式的數據庫) 大量的相似結構的數據的儲存,快速的查詢。特殊的文件(
Android進階中級教程——1.1 Git的本地使用詳解 Android進階中級教程——1.1 Git的本地使用詳解 標簽(空格分隔): And