当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

7.3.1 Android 文件上传

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:49

本节引言本节和下一节文件下载一样,慎入...现在实际开发涉及文件上传不会自己写上传代码,一般会集成第三网络库来做图片上传,比如android-async-http,okhttp等,另外还有七牛也提供了下载和上传的API,喜欢的可以去官网查看相关的API文档!本节的话有兴趣看看就好!1.项目用到的图片上传的关键方法:思前想后,还是决定先贴下公司项目中用到的图片上传的核心方法,这里用到一个第三方的库:android-async-http.jar,自己到github下下这个库~然后调用一下下面的方法即可,自己改下url!上传图片的核心方法如下:private void sendImage(Bitmap bm){ ByteArrayOutputStream stream = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 60, stream); byte[] bytes = stream.toByteArray(); String img = new String(Base64.encodeToString(bytes, Base64.DEFAULT)); AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.add("img", img); client.post("http:xxx/postIcon", params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { Toast.makeText(MainActivity.this, "Upload Success!", Toast.LENGTH_LONG).show(); } @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { Toast.makeText(MainActivity.this, "Upload Fail!", Toast.LENGTH_LONG).show(); } });}2.使用HttpConnection上传文件:简直卧槽...各种设置,各种麻烦...还是建议用1的方法吧,当然,实在太闲可以看看,有轮子可用还是先别自己造轮子了...public class SocketHttpRequester { /** * 发送xml数据 * @param path 请求地址 * @param xml xml数据 * @param encoding 编码 * @return * @throws Exception */ public static byte[] postXml(String path, String xml, String encoding) throws Exception{ byte[] data = xml.getBytes(encoding); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding); conn.setRequestProperty("Content-Length", String.valueOf(data.length)); conn.setConnectTimeout(5 * 1000); OutputStream outStream = conn.getOutputStream(); outStream.write(data); outStream.flush(); outStream.close(); if(conn.getResponseCode()==200){ return readStream(conn.getInputStream()); } return null; } /** * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: * <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input type="file" name="zip"/> </FORM> * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试, * 因为它会指向手机模拟器,你可以使用http://www.baidu.com或http://192.168.1.10:8080这样的路径测试) * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */ public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception { //数据分隔线 final String BOUNDARY = "---------------------------7da2137580612"; //数据结束标志"---------------------------7da2137580612--" final String endline = "--" + BOUNDARY + "--/r/n"; //下面两个for循环都是为了得到数据长度参数,依据表单的类型而定 //首先得到文件类型数据的总长度(包括文件分割线) int fileDataLength = 0; for(FormFile uploadFile : files) { StringBuilder fileExplain = new StringBuilder(); fileExplain.append("--"); fileExplain.append(BOUNDARY); fileExplain.append("/r/n"); fileExplain.append("Content-Disposition: form-data;name=/""+ uploadFile.getParameterName()+"/";filename=/""+ uploadFile.getFilname() + "/"/r/n"); fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"/r/n/r/n"); fileExplain.append("/r/n"); fileDataLength += fileExplain.length(); if(uploadFile.getInStream()!=null){ fileDataLength += uploadFile.getFile().length(); }else{ fileDataLength += uploadFile.getData().length; } } //再构造文本类型参数的实体数据 StringBuilder textEntity = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { textEntity.append("--"); textEntity.append(BOUNDARY); textEntity.append("/r/n"); textEntity.append("Content-Disposition: form-data; name=/""+ entry.getKey() + "/"/r/n/r/n"); textEntity.append(entry.getValue()); textEntity.append("/r/n"); }

[1] [2] [3]  下一页


7.3.1 Android 文件上传