Android上传文件
来源:互联网 发布:电影网站数据库设计 编辑:程序博客网 时间:2024/06/15 00:04
Android开发经常遇到要上传文件,我在网上找了一些文件上传的解决方案,自己做了一个整合。JavaWeb端参考:JavaWeb学习总结(五十)——文件上传和下载
直接上代码:
1,HttpURLConnection上传文件
package com.yyw.mutilthreaddownload;import android.util.Log;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.HashMap;import java.util.UUID;/** * HttpURLConnection上传文件 */public class HttpUpLoad { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 10000000; // 超时时间 private static final String CHARSET = "utf-8"; // 设置编码 public static final String SUCCESS = "1"; public static final String FAILURE = "0"; /** * * @param params 上传的参数 * @param file 文件 * @param RequestURL url地址 * @return 返回 */ public static String uploadFile(HashMap<String,String>params,File file ,String RequestURL) { String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成 String PREFIX = "--", LINE_END = "\r\n"; String CONTENT_TYPE = "multipart/form-data"; // 内容类型,指定为上传文件 try { URL url = new URL(RequestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoInput(true); // 允许输入流 conn.setDoOutput(true); // 允许输出流 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); // 请求方式,必须是大写POST,GET conn.setRequestProperty("Charset", CHARSET); // 设置编码 conn.setRequestProperty("connection", "keep-alive"); //在请求头中添加请求的分界符 conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); if (file != null) { /** * 当文件不为空,把文件包装并且上传 */ OutputStream outputSteam = conn.getOutputStream(); //准备上传文件 DataOutputStream dos = new DataOutputStream(outputSteam); StringBuffer sb = new StringBuffer(); /************************上传表单的一些设置信息***********************************/ if (params != null) for (String key : params.keySet()) { sb.append("--" + BOUNDARY + "\r\n"); sb.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n"); sb.append("\r\n"); sb.append(params.get(key) + "\r\n"); } /************************上传文件的一些设置信息***********************************/ sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END); /** * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 * filename是文件的名字,包含后缀名的 比如:abc.png */ sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"" + LINE_END); sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END); sb.append(LINE_END); dos.write(sb.toString().getBytes()); /************************上传文件***********************************/ InputStream is = new FileInputStream(file); byte[] bytes = new byte[1024]; int len = 0; while ((len = is.read(bytes)) != -1) { dos.write(bytes, 0, len); Log.i(TAG, "上传成功 +" + len); } is.close(); /************************上传文件结束后的结束符号***********************************/ dos.write(LINE_END.getBytes()); byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END) .getBytes(); dos.write(end_data); dos.flush(); /** * 获取响应码 200=成功 当响应成功,获取响应的流 */ int res = conn.getResponseCode(); if (res == 200) { //获取返回内容 InputStream input = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String result = reader.readLine(); Log.i(TAG,"上传成功" + result); reader.close(); is.close(); Log.i(TAG,"上传成功 +"+conn.getResponseMessage()); return SUCCESS; } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return FAILURE; }}用HttpURLConnection上传文件有文件大小的限制。参考:从原理角度解析Android (Java) http 文件上传写了一个demo
package com.yyw.mutilthreaddownload;import android.util.Log;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.net.URL;import java.util.Map;/** * Created by yyw on 2016/1/19. * 用Socket模拟HTTP上传比较大的文件, */public class UpBigFile { public static final String TAG = "UpBigFile"; private String charset = "UTF-8"; /** * * @param params 参数 * @param file 文件 * @param url url */ public void upLoadByScoket(Map<String, String> params,File file, String url) { try { String end = "\r\n"; URL mUrl = new URL(url); String param = getParamString(params);//参数 String fileHeader = getFileHeader(file);//文件的头 String fileEnder = getFileEnder();//内容结束 long l = param.length()+fileHeader.length()+fileEnder.length()+3*end.length()+file.length();//内容的长度 String header = getHeaderString(url, mUrl,l);//请求头 Socket mSocket = new Socket(mUrl.getHost(),mUrl.getPort());//用Socket模拟HTTP请求 OutputStream os = mSocket.getOutputStream(); PrintStream ps = new PrintStream(os,true,charset); Log.d(TAG, "upLoadByScoket: " + header); ps.print(header); ps.print(end); ps.print(param); ps.print(end); ps.print(fileHeader); ps.print(end); FileInputStream is = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = -1; int count = 0; while ((len = is.read(buffer))!=-1){ count += len; Log.i(TAG,"上传成功 +"+count); os.write(buffer,0,len); } os.flush(); ps.print(end); ps.print(fileEnder); InputStream input = mSocket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String result = reader.readLine();//返回内容 Log.i(TAG, "上传成功" + result); reader.close(); is.close(); os.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 文件开始符号 * @param file * @return */ private String getFileHeader(File file){ String boundary = "******"; String end = "\r\n"; StringBuilder builder = new StringBuilder(); builder.append("--"); builder.append(boundary); builder.append(end); builder.append("Content-Disposition: form-data; name=\"file\";filename =\""+file.getName()+"\""+end); builder.append("Content-Type: application/octet-stream; Charset="); builder.append(charset); builder.append(end); return builder.toString(); } /** * 内容结束符号 * @return 内容结束符号 */ private String getFileEnder(){ String boundary = "******"; String end = "\r\n"; return "--" + boundary + "--" + end; } /** * 获取请求的表单参数字符串 * @param params 参数内容 * @return 请求的表单参数字符串 */ private String getParamString(Map<String, String> params) { String boundary = "******"; StringBuilder param = new StringBuilder(); if (params != null) for (String key : params.keySet()) { param.append("--" + boundary + "\r\n"); param.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n"); param.append("\r\n"); param.append(params.get(key) + "\r\n"); } return param.toString(); } /** * 获取上传的请求头(模仿HTTP请求头) * @param url 地址 * @param mUrl 地址URL * @param length 上传内容的长度 * @return 上传请求头 */ private String getHeaderString(String url, URL mUrl,long length) { String end = "\r\n"; String connection = "keep-alive"; String contentType = "multipart/form-data"; String boundary = "******";// POST http://192.168.0.55:8082/LearnNew/servlet/UploadHandleServlet HTTP/1.1// Charset: UTF-8// connection: keep-alive// Content-Type: multipart/form-data;boundary=******// User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.1; GT-N8000 Build/JRO03C)// Host: 192.168.0.55:8082// Accept-Encoding: gzip// Content-Length: 2484 StringBuilder header = new StringBuilder(); header.append("POST "); header.append(url); header.append(" HTTP/1.1"); header.append(end); header.append("Charset: "); header.append(charset); header.append(end); header.append("connection: "); header.append(connection); header.append(end); header.append("Content-Type: "); header.append(contentType); header.append(";boundary="); header.append(boundary); header.append(end); header.append("User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.1; GT-N8000 Build/JRO03C)"); header.append(end); header.append("Host: "); header.append(mUrl.getHost()); header.append(end); header.append("Accept-Encoding: gzip"); header.append(end); header.append("Content-Length: "); header.append(length); header.append(end); header.toString(); return header.toString(); }}上传的信息内容:
POST http://192.168.0.55:8082/LearnNew/servlet/UploadHandleServlet HTTP/1.1Charset: UTF-8connection: keep-aliveContent-Type: multipart/form-data;boundary=******User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.1; GT-N8000 Build/JRO03C)Host: 192.168.0.55:8082Accept-Encoding: gzipContent-Length: 2484--******Content-Disposition: form-data; name="name"zhangshan--******Content-Disposition: form-data; name="file";filename ="21_55-1447057315784.log"replacements=[Ljava.lang.String;@40dcc5d0HARDWARE=hws8301lmatchers=[Ljava.lang.String;@40dcc550RADIO=unknownHOST=screen105HIDE_PRODUCT_INFO=falseTAGS=release-keysPRODUCT_CHARM=MediaPad X1 7.0ID=HuaweiMediaPadMIN_VERSION_LENGTH=8MANUFACTURER=HUAWEITYPE=userTAG=BuildTIME=1403853553000FINGERPRINT=Huawei/MediaPad/hws8301l:4.2.2/HuaweiMediaPad/S8301uV1R1C233B009:user/release-keysUNKNOWN=unknownPRODUCT_8VOGUE=MediaPad M1 8.0BOARD=BalongV9R1VERSION_MAX_SIZE=30properties={ro.build.internal.t.version=S8-301uV100R001C233B009-01, ro.build.cust.id=S8-301uV100R001C233B009, ro.build.operator.id=S8-301uV100R001C233B009}PRODUCT=MediaPadFilePath=/cust/hwver.propertiesDISPLAY=S8-301uV100R001C233B009USER=jslaveDEVICE=hws8301lMODEL=MediaPad M1 8.0BOOTLOADER=unknownCPU_ABI=armeabi-v7aPRODUCT_UNKNOWN=unknownCPU_ABI2=armeabiIS_DEBUGGABLE=falseSERIAL=A8Z6R14613000263BRAND=Huawei--******--
Android的一个OkHttp的开源网络访问上传文件会很方便。
/** * 上传文件 * @param url * @param file */ private void upFile(String url,File file){ OkHttpClient client = new OkHttpClient(); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addPart(Headers.of("Content-Disposition", "form-data; name=\"file\";filename =\""+file.getName()+"\""),RequestBody.create(null,file)).build(); Request request = new Request.Builder().post(body).url(url).build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String r = response.body().string(); if (response.isSuccessful()) { Log.i(TAG, "httpGet1 OK: " + r); } else { Log.i(TAG, "httpGet1 error: " + r); } } }); }
1 0
- android http上传文件
- Android 上传大文件
- Android 上传大文件
- android 文件上传
- android 上传文件类
- android上传文件
- Android 文件上传参考
- Android 文件的上传
- Android入门:文件上传
- android之文件上传
- Android 上传文件
- Android上传文件,续
- android httpclient 上传文件
- android 文件上传
- Android中的文件上传
- android 文件上传
- Android文件上传
- Android文件上传
- Windows UI 测试
- <input>表单元素readonly时光标仍然可见
- tomcat处理请求导致页面出现ERR_CONNECTION_RESET错误解决方案
- PHP变量作用域
- Java内存泄漏发生的情况
- Android上传文件
- mysql 简单命令
- androidStudio 生成jar 文件
- VC中的adb通信
- 14.Using the CUSTOMERS table, you need to generate a report that shows 50% of each credit amount
- 改变状态栏字体颜色
- C++相关的复习
- 编译器对齐机制——由一道求C++类大小的题说开
- 函数