代码非原创,fix了bug,完善的还是需要再思量:
/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params,
Map<String, File> files) throws IOException {
String BOUNDARY = java.util.UUID.randomUUID().toString();
String PREFIX = "--" , LINEND = "\r\n";
String MULTIPART_FROM_DATA = "multipart/form-data";
String CHARSET = "UTF-8";
URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 1000); // 缓存的最长时间
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());
// 发送文件数据
if(files!=null){
int i = 0;
for (Map.Entry<String, File> file: files.entrySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
outStream.write(LINEND.getBytes());
}
}
//请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
//得到响应码
int res = conn.getResponseCode();
InputStream in = null;
if (res == 200) {
in = conn.getInputStream();
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
return in == null ? null : in.toString();
}
最简单的PHP测试代码:
if($_FILES){
foreach($_FILES as $v){
copy($v[tmp_name], $v[name]);
}
}
参考自 Android中发送Http请求实例(包括文件上传、servlet接收),修复了几个问题:
1 多文件上传 file"+(i++)+"
2 返回的错误
分享到:
相关推荐
上传文件到服务器 将本地文件上传到服务器
Android上传文件到 net服务器 包含两方代码
Android端选择文件上传至服务器端,连同服务器端代码一同给出,小伙伴们,如果有什么好的建议请发送到我的邮箱whsgzcy@foxmail.com
安卓上传文件到服务器源码,很好的一个上传例子
android上传文件,图片,音频,视频等等到服务器
android上传文件到服务器(客户端加服务端源码),支持多文件上传
Android一个简单实用把Log日志打印到手机本地文件,可以自行取出来上传到服务器开源代码
实现:将android文件通过服务端上传至服务器; 获取android本地文件,通过调用服务端后台代码进行文件上传。 只需要分别调用移动端uploadMultiFile()方法和服务端upload()方法。
资源来自博客http://blog.csdn.net/footballclub/article/details/43636813,有问题欢迎给我留言,一起探讨!
Android上传文件到ftp服务器,支持多文件上传和单文件上传
通过http协议实现android的文件上传,服务器端使用servlet实现
Android上传文件到 .net服务器,服务器使用webservice.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
一个完整的demo用于android客户端上传文件到客户端,由tomcat搭建的服务器服务器,采用文件流的形式准确无误.
经学习麦子学院视频,实现文件上传到服务器端。以上传图片为例,选取手机上的图片,获得图片的图片路径,获得图片流。使用使用httpmine来上传
android通过HTTP协议上传文件至远程服务器,此示例包含android客户端和服务器端项目,适合初学者
代码实现了上传一个或者多个文件到apache服务器。
android上传文件至服务器提供客户端下载,带有客户端和服务器端源码!
Android端上传文件的jar包
安卓上传照片到nodejs服务器.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)