当前位置:操作系统 > 安卓/Android >>

在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传

 

通过构造基于HTTP 协议的传输内容实现图片自动上传到服务器功能 。如果自己编码构造HTTP 协议,那么编写的代码质量肯定不高,建议模仿HttpClient .zip examples \mime\ClientMultipartFormPost.java 来实现,并通过源码来进一步理解如何优雅高效地构造HTTP 协议传输内容。

 

自己构造HTTP 协议传输内容的想法,从何而来呢?灵感启迪于这篇博文“Android下的应用编程——用HTTP协议实现文件上传功能 ”,以前从未想过通过抓取HTTP 请求数据格式,根据协议自己构造数据来实现数据提交。哎,Out 了。因为Apache HttpClient 框架就是通过此方式来实现的,以前从未注意到,看来以后要多多向前人学习啊!结果是:阅读了此框架的源码后,才知道自己编写的代码和人家相比真不是一个档次的。现在已经下定决心了,多读开源框架代码,不但可以熟悉相关业务流程,而且还可以学到设计模式在实际业务需求中的应用,更重要的是领悟其中的思想。业务流程、实践能力、框架思想,一举三得,何乐而不为呢。^_^

 

test.html 部分源码:

 

<form action="Your_Action_Url " method="post" enctype="multipart/form-data " name="form1" id="form1">

  <p>

    <label for="upload_file"></label>

    <input type="file" name="upload_file" id="upload_file " />

  </p>

  <p>

    <input type="submit" name="action" id="action " value="upload " />

  </p>

</form>

 

通过HttpWatch 查看抓取到的包数据格式:

 

 

下面将分别通过按照HttpWatch 抓取下来的协议格式内容构造传输内容实现文件上传功能和基于HttpClient 框架实现文件上传功能。

 

项目配置目录Your_Project/config ,相关文件 如下:

 

actionUrl.properties 文件内容:

 

Your_Action_Url

 

formDataParams.properties 文件内容(对应HTML Form 属性内容):

 

action =upload

 

imageParams.properties 文件内容(这里文件路径已配置死了,不好!建议在程序中动态设置,即通过传入相关参数实现。):

 

upload_file =images/roewe.jpg

 

MIMETypes.properties 文件内容(参考自Multimedia MIME Reference ):

 

jpeg:image/jpeg

jpg:image/jpeg

png:image/png

gif:image/gif

 

 

 

1. 在《Android下的应用编程——用HTTP协议实现文件上传功能 》代码的基础上,通过进一步改进得到如下代码(Java、Android 都可以run):

 

 

Java代码 

/** 

 * 文件名称:UploadImage.java 

 * 

 * 版权信息:Apache License, Version 2.0 

 * 

 * 功能描述:实现图片文件上传。 

 * 

 * 创建日期:2011-5-10 

 * 

 * 作者:Bert Lee 

 */ 

 

/* 

 * 修改历史: 

 */ 

public class UploadImage {  

    String multipart_form_data = "multipart/form-data";  

    String twoHyphens = "--";  

    String boundary = "****************fD4fH3gL0hK7aI6";    // 数据分隔符  

    String lineEnd = System.getProperty("line.separator");    // The value is "\r\n" in Windows.  

      

    /* 

     * 上传图片内容,格式请参考HTTP 协议格式。 

     * 人人网Photos.upload中的”程序调用“http://wiki.dev.renren.com/wiki/Photos.upload#.E7.A8.8B.E5.BA.8F.E8.B0.83.E7.94.A8 

     * 对其格式解释的非常清晰。 

     * 格式如下所示: 

     * --****************fD4fH3hK7aI6 

     * Content-Disposition: form-data; name="upload_file"; filename="apple.jpg" 

     * Content-Type: image/jpeg 

     * 

     * 这儿是文件的内容,二进制流的形式 

     */ 

    private void addImageContent(Image[] files, DataOutputStream output) {  

        for(Image file : files) {  

            StringBuilder split = new StringBuilder();  

            split.append(twoHyphens + boundary + lineEnd);  

            split.append("Content-Disposition: form-data; name=\"" + file.getFormName() + "\"; filename=\"" + file.getFileName() + "\"" + lineEnd);  

            split.append("Content-Type: " + file.getContentType() + lineEnd);  

            split.append(lineEnd);  

            try {  

                // 发送图片数据  

                output.writeBytes(split.toString());  

                output.write(file.getData(), 0, file.getData().length);  

                output.writeBytes(lineEnd);  

            } catch (IOException e) {  

                throw new RuntimeException(e);  

            }  

        }  

    }  

      

    /* 

     * 构建表单字段内容,格式请参考HTTP 协议格式(用FireBug可以抓取到相关数据)。(以便上传表单相对应的参数值) 

     * 格式如下所示: 

     * --****************fD4fH3hK7aI6 

     * Content-Disposition: form-data; name="action" 

     * // 一空行,必须有 

     * upload 

     */ 

    private void addFormField(Set<Map.Entry<Object,Object>> params, DataOutputStream output) {  

        StringBuilder sb = new StringBuilder();  

        for(Map.Entry<Object, Object> param : params) {  

            sb.append(tw

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,