本文实例讲述了Android使用post方式上传图片到服务器的方法。分享给大家供大家参考,具体如下:

/**

* 上传文件到服务器类

*

* @author tom

*/

public class UploadUtil {

private static final String TAG = "uploadFile";

private static final int TIME_OUT = 10 * 1000; // 超时时间

private static final String CHARSET = "utf-8"; // 设置编码

/**

* Android上传文件到服务端

*

* @param file 需要上传的文件

* @param RequestURL 请求的rul

* @return 返回响应的内容

*/

public static String uploadFile(File file, String RequestURL) {

String result = null;

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"); // 请求方式

conn.setRequestProperty("Charset", CHARSET); // 设置编码

conn.setRequestProperty("connection", "keep-alive");

conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);

if (file != null) {

/**

* 当文件不为空,把文件包装并且上传

*/

DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

StringBuffer sb = new StringBuffer();

sb.append(PREFIX);

sb.append(BOUNDARY);

sb.append(LINE_END);

/**

* 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件

* filename是文件的名字,包含后缀名的 比如:abc.png

*/

sb.append("Content-Disposition: form-data; name=\"uploadfile\"; 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);

}

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();

Log.e(TAG, "response code:" + res);

// if(res==200)

// {

Log.e(TAG, "request success");

InputStream input = conn.getInputStream();

StringBuffer sb1 = new StringBuffer();

int ss;

while ((ss = input.read()) != -1) {

sb1.append((char) ss);

}

result = sb1.toString();

Log.e(TAG, "result : " + result);

// }

// else{

// Log.e(TAG, "request error");

// }

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return result;

}

/**

* 通过拼接的方式构造请求内容,实现参数传输以及文件传输

*

* @param url Service net address

* @param params text content

* @param files pictures

* @return String result of Service response

* @throws IOException

*/

public static String post(String url, Map params, Map 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(url);

HttpURLConnection conn = (HttpURLConnection) uri.openConnection();

conn.setReadTimeout(10 * 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 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)

for (Map.Entry file : files.entrySet()) {

StringBuilder sb1 = new StringBuilder();

sb1.append(PREFIX);

sb1.append(BOUNDARY);

sb1.append(LINEND);

sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""

+ file.getValue().getName() + "\"" + 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 = conn.getInputStream();

StringBuilder sb2 = new StringBuilder();

if (res == 200) {

int ch;

while ((ch = in.read()) != -1) {

sb2.append((char) ch);

}

}

outStream.close();

conn.disconnect();

return sb2.toString();

}

}

示例调用第二种方式上传:

final Map params = new HashMap();

params.put("send_userId", String.valueOf(id));

params.put("send_email", address);

params.put("send_name", name);

params.put("receive_email", emails);

final Map files = new HashMap();

files.put("uploadfile", file);

final String request = UploadUtil.post(requestURL, params, files);

希望本文所述对大家Android程序设计有所帮助。

android上传本地图片到服务器上,Android使用post方式上传图片到服务器的方法相关推荐

  1. kindeditor上传本地图片的问题

    终于给我发现kindeditor上传本地图片时,为什么出现服务器错误 原来demo.jsp里的: KE.show({ id : 'content1', imageUploadJson : '../.. ...

  2. element-tiptap富文本编辑器,上传本地图片

    因为通过富文本编辑器上传本地图片,都会直接转成base64格式的,我们可以先上传到服务器,再从服务器返回的URL拿到给富文本框展示(引入我就不说了,直接看我上篇文章有说到过) data () {// ...

  3. php上传图片代码编辑,simditor上传本地图片 php

    网上有很多simditor这个编辑器的文档,但是大多是重复的,并且php做服务端的也很少.最近做了一个上传功能,研究了一下,跟大家分享一下. 首先 说一下逻辑,理解好了逻辑,才能更好的理解代码. 点击 ...

  4. tinymce4.x 上传本地图片(自己写个插件)

    tinymce是一款挺不错的html文本编辑器.但是添加图片是直接添加链接,不能直接选择本地图片. 下面我写了一个插件用于直接上传本地图片. 在tinymce的plugins目录下新建一个upload ...

  5. 富文本框TinyMCE4.8上传本地图片基本配置(前端篇)

    最近使用了一下TinyMCE富文本框,感觉是非常不错的一款,配置简单,界面优美,完全免费...推荐大家使用. 官方文档也比较容易阅读,大家有兴趣的可以自己去看看https://www.tiny.clo ...

  6. 解决MarkDown上传本地图片无法显示

    解决MarkDown上传本地图片无法显示 前言 提示:什么牛头马面写的代码,今天写个技术博客想插入一张图片发现无法显示,接着按流程在博客一顿找,发现我开头第一句,不知道怎么形容垃圾场里面找垃圾的心情. ...

  7. 有道云笔记markdown上传本地图片的方法

    有道云笔记markdown上传本地图片的方法   有道云笔记markdown模式非会员发现不能直接截屏粘贴图片了.后来网上搜集了下方法,发现了好几种解决办法.   当然,如果你一年,不差那两百块钱,直 ...

  8. 关于wangEditor5上传本地图片的详细配置

    最近在写个人博客用到了富文本编辑器,这里用的是wangEditor5版本,但是浏览了官网并没有发现上传本地图片的详细配置,很是头疼,最终在官方的demo源码中找到了本地上传的详细配置,豁然开朗! co ...

  9. 无水印上传本地图片到网络获取地址+小书匠使用 +github和 七牛云 图床绑定--菜鸟小回

    无水印上传本地图片到网络获取地址+小书匠使用 +github和 七牛云 图床绑定 简介: 最近开始写博客,缺少一个Markdown编辑器.寻找了两三天终于找到了这款<小书匠>,可复制粘图, ...

  10. 如何在CSND上传本地图片

    如何在CSND上传本地图片 1.全选markdown的内容,粘贴到msdn上, 2.根据本地图片的路径,以及文件名,找到本地图片的地址, 3.复制图片名称, 4.选择图片,进行本地图片的上传 5.上传 ...

最新文章

  1. 开源软件License汇总
  2. 使用Epoll 能监听普通文件吗?
  3. Error in x$e : $ operator is invalid for atomic vectors
  4. 禁止蒙层底部页面跟随滚动 1
  5. SNMP在企业网中应用
  6. Python3 的内置函数和闭包
  7. 正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询
  8. Oracle中默认创建的表
  9. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
  10. 路面压电发电,应该有前途
  11. java代码注释规范
  12. 使用Outlook发送邮件自定义发件人
  13. 天黑请闭眼服务器维护中,天黑请闭眼!
  14. 扫雷用递归实现拓展空白详解
  15. 市场系统技术培训教材 ADSL/ATM功能
  16. 7-18 出租车计价
  17. 鼻炎和慢性咽喉炎注意事项 (休息、饮食、卫生)
  18. openlayers 雷达回波的实现
  19. 通话效果好的蓝牙耳机有哪些?音质表现好的蓝牙耳机推荐
  20. 2021云栖大会【视觉AI平台与生态论坛】线上直播等你来~

热门文章

  1. 用测试驱动开发状态机
  2. CVPR2019目标检测论文看点:并域上的广义交
  3. java多线程消息队列_java多线程消息队列的实现
  4. mysql效率优化_MySQL性能优化的最佳12条经验
  5. cygwin执行.py提示找不到模块,但已经安装模块的解决办法
  6. Can't create table... error150
  7. [Offer收割]编程练习赛63
  8. Android WiFi开发教程(三)——WiFi热点数据传输
  9. python基础:python扩展包的安装方式
  10. CSAPP(4):存储器层次结构