`
熊滔爱孟涛静
  • 浏览: 124839 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

post 附件

 
阅读更多

在做嘀咕客户端的时候,要实现拍照上传的功能。根据嘀咕api提供的接口,文档看上去很复杂,我用一个简单html文件来说明问题。

几个关键点:

这个表单使用post方法

有几个文本域,还用到file域,即文件上传

编码用utf-8

接下来,我在android中使用HttpURLConnection来构建一个符合这些规则的表单Post到服务器。

到底这个表单是怎么样的一种结构,它肯定是要根据http传输协议来构造出来的。我介绍一种非常直观的方法。利用FireFox的FireBug插件,我们在这个html表单上点击提交时候,可以看到这个请求到底是怎么样的。

明白了要做什么事情,接下来就是用java代码来构建这样的StringBuffer了。

下面给出代码

/**
	 * 上传附件 (拍照)
	 * @param bitmap  待上传的Bitmap图
	 * @param fileKey 表单变量名
	 * @param urlstr  上传地址
	 * @param hmap    参数
	 * @param ctx     context
	 * @return
	 */
	public static String postFileFromBitmap2(String urlstr, HashMap<String, String> hmap) {
		dout("postURLContent:" + urlstr);
		String fileKey = "image0";
		String rs = "";
		String temp = "temp.jpg";
		Bitmap2File(bitmap, temp, U.ctx_for_getResString);
		String exsistingFileName = U.ctx_for_getResString.getFilesDir() + "/" + temp;

		String lineEnd = "\r\n";
		String twoHyphens = "--";

		String boundary = "---------------------------11538186919912";
		try {
			File f = new File(exsistingFileName);
			FileInputStream fileInputStream = new FileInputStream(f);
			if (!f.exists())
				return rs;
			URL url = new URL(urlstr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
			//兼容嘀咕的用户账户密码信息必须通过 AUTH_HTTP 方式提供
			if(hmap.containsKey("AUTH_HTTP_ENCODING")){
				conn.setRequestProperty("Authorization", "Basic " + hmap.get("AUTH_HTTP_ENCODING"));
			}

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

			dos.writeBytes(twoHyphens + boundary + lineEnd);
	        dos.writeBytes("Content-Disposition: form-data; name=\"content\""+ lineEnd);
	        dos.writeBytes(lineEnd + URLEncoder.encode(""+hmap.get("content"), "UTF-8")+ lineEnd);

			dos.writeBytes(twoHyphens + boundary + lineEnd);
	        dos.writeBytes("Content-Disposition: form-data; name=\"source\""+ lineEnd);
	        dos.writeBytes(lineEnd + URLEncoder.encode(""+hmap.get("source"), "UTF-8")+ lineEnd);

			dos.writeBytes(twoHyphens + boundary + lineEnd);
	        dos.writeBytes("Content-Disposition: form-data; name=\"uploadImg\""+ lineEnd);
	        dos.writeBytes(lineEnd + URLEncoder.encode("xiexiezhichi", "UTF-8")+ lineEnd);

	        dos.writeBytes(twoHyphens + boundary + lineEnd);
			dos.writeBytes("Content-Disposition: form-data; name=\"" + fileKey + "\";filename=\"" + exsistingFileName+ "\"" + lineEnd);
			dos.writeBytes("Content-Type: image/jpeg"+lineEnd);
			dos.writeBytes(lineEnd);

			int bytesAvailable = fileInputStream.available();
			byte[] buffer = new byte[bytesAvailable];
			int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
			while (bytesRead > 0) {
				dos.write(buffer, 0, bytesAvailable);
				bytesAvailable = fileInputStream.available();
				bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
			}
			dos.writeBytes(lineEnd);
			dos.writeBytes(boundary + lineEnd);
			fileInputStream.close();

			dos.writeBytes(twoHyphens + boundary + lineEnd);
			dos.writeBytes("Content-Disposition: form-data; name=\"image1\";filename=\"\"" + lineEnd);
			dos.writeBytes("Content-Type: application/octet-stream"+lineEnd);
			dos.writeBytes(lineEnd);
			dos.writeBytes(twoHyphens + boundary + lineEnd);

			dos.writeBytes("Content-Disposition: form-data; name=\"image2\";filename=\"\"" + lineEnd);
			dos.writeBytes("Content-Type: application/octet-stream"+lineEnd);
			dos.writeBytes(lineEnd);
			dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

			dos.flush();
			dos.close(); 

			InputStream in = conn.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			StringBuffer sb2 = new StringBuffer();
			String tmp = null;
			while ((tmp = br.readLine()) != null) {
				sb2.append(tmp);
			}
			br.close();
			in.close();
			return sb2.toString();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return rs;
	}

分享到:
评论

相关推荐

    C# HTTP POST 附件

    C# HTTP POST 附件的方法,是源代码。

    c# .net后台post上传文件

    当我们谈论"C# .NET后台post上传文件"时,我们通常是指在Web应用中通过HTTP POST请求将文件从客户端(如浏览器)上传到服务器的过程。在这个场景中,特别是涉及到图片上传,可能的应用场景包括用户头像上传、产品...

    post提交工具增强版

    在使用过程中,用户应确保从可信源获取软件,并遵循安全的最佳实践,如定期更新、不随意打开未知来源的附件,以免受到潜在的安全威胁。 总之,"POST提交工具增强版"为用户提供了更强大、更灵活的HTTP POST请求管理...

    C#用POST方式发送数据大小不受限制的方法

    ### C#用POST方式发送数据大小不受限制的方法 在C#开发中,通过POST方式发送数据是一种常见的网络请求处理方式。然而,在实际操作过程中,可能会遇到数据传输大小受限的问题,尤其是在向云服务器发送大型文件时更为...

    数据抽取-Kettl动态参数调用HTTP、POST接口

    - 设置Body:POST请求的主要内容,可以是JSON、XML或其他格式,同样可以使用动态参数。 4. 动态参数的使用:在Kettle中,可以使用变量(Variable)、环境变量(Environment variable)或字段(Field)作为动态参数...

    Lotus domino BS 多附件上传例子 Lotus domino jquery附件上传 domino上传附件不刷新界面

    3. **创建Ajax请求**:使用jQuery的`$.ajax()`或`$.post()`方法创建一个异步请求,将文件数据发送到服务器。 4. **服务器处理**:Lotus Domino服务器端接收文件,保存到数据库或其他存储介质,并返回处理结果。 5. *...

    VSTO开发Outlook发送超大附件

    2:增加MailItem的AttachmentAdd事件 通过判断附件大小 小于 Mb 则保存在附件 大于 Mb则后台Post到Web或FTP服务器 并返回连接 4:将连接作为html 的超链接模式&lt;A href &quot;返回值&quot;&gt;下载超大附件&lt; A&gt...

    js发送post请求下载文件

    大家都知道ajax是不能直接下载文件的,所以一般都是通过一个超链接的形式去下载一个文件 但是当牵扯到需要发送很多数据到服务器上再下载的时候超链接的形式就有些太过勉强了,如下是一个工具方法(依赖jquery) 可以...

    C# 使用Get和Post请求获取数据

    POST请求用于向服务器发送大量数据,如表单数据或二进制数据,这些数据不会显示在URL中。POST请求的安全性相对更高,因为它不会将数据暴露在浏览器历史记录中。在C#中,你可以使用`HttpClient`的`PostAsync`方法来...

    mantis上传附件大小问题

    为了确保Mantis能够正常处理较大尺寸的附件,通常建议设置`post_max_size`的值大于等于`upload_max_filesize`的值。例如,在示例内容中提到的`post_max_size=8M`和`upload_max_filesize=2M`,即意味着可以通过...

    c# http协议,实现get或post发送请求 并返回内容

    2. POST:POST请求则用于向服务器发送数据,通常用于提交表单或者上传文件。POST请求的数据包含在请求体中,对数据量无明显限制,且数据对用户不可见。 在C#中,我们可以使用`System.Net.Http`命名空间中的...

    这是我提问帖中的附件Post.rar

    本篇将重点解析标题为"这是我提问帖中的附件Post.rar"的压缩包,探讨RAR格式的特点以及如何处理RAR文件,特别是其中的Post.txt文件。 RAR是一种流行的压缩文件格式,由俄罗斯软件开发者Eugene Roshal开发。相比ZIP...

    C++使用libcurl提供的API上传文件且Post表单数据

    在这个场景中,我们将深入探讨如何利用libcurl在C++中上传文件并发送POST表单数据。 首先,`con_test.cpp`是主要的源代码文件,它包含了使用libcurl进行文件上传和POST操作的具体实现。`StdAfx.cpp`和`StdAfx.h`是...

    C#模仿http请求到服务器端 上传附件

    在上传附件的情况下,请求体通常包含了文件内容。 1. **创建HTTP请求**: 可以使用`System.Net.HttpWebRequest`类来创建HTTP请求。首先,你需要实例化这个类,并设置其`RequestUri`属性为服务器的URL。例如: ```...

    关于修改Roundcube Webmail上传附件的大小

    ### 关于修改Roundcube Webmail上传附件的大小 在日常工作中,我们经常需要通过电子邮件发送文件,有时这些文件的大小超过了默认的限制,这就会导致发送失败或出现其他错误。对于使用Roundcube Webmail系统的用户而...

    C# 后台请求接口的方法(GET,POST)

    根据给定的文件信息,我们可以总结出以下关于C#后台请求接口的方法(GET, POST)的知识点: ### C#后台请求接口方法概述 在Web开发过程中,前后端之间的数据交互非常关键,通常会使用HTTP协议中的GET和POST两种...

    Discuz!X2 增加附件说明

    附件说明:{$post['attachment'][$i]['attachcomment']} ``` 这段代码会在每个附件下方显示已有的附件说明,如果用户未填写,则不显示。为了允许用户添加新的说明,我们需要在附件上传或编辑时提供一个输入字段。...

    C# 邮箱附件下载

    首先,我们需要了解的是POP3(Post Office Protocol version 3)协议,它是用于从邮件服务器检索电子邮件的标准协议。在C#中,我们可以使用`System.Net.Mail`命名空间中的`Pop3`类来与POP3服务器进行交互。`Pop3`类...

    Asp.Net MVC中jquery.form附件上传例子

    在Asp.Net MVC框架中,使用jQuery Form插件进行附件上传是一种常见的实践,它能够提供异步、非刷新的用户体验。jQuery Form插件是jQuery库的一个扩展,它使得表单提交变得更加灵活和易于控制,特别是在处理文件上传...

Global site tag (gtag.js) - Google Analytics