首页 > 其他分享 >Android多文件上传的原理

Android多文件上传的原理

时间:2023-07-28 18:36:43浏览次数:34  
标签:java name conn import 原理 Android 上传 append


android上面图片的上传可以用apache包里面的httpclient和MultipartEntity来上传图片,这种的上传方式的话由于都封装好了所以看不到HTTP协议里面具体是怎样上传的;

其实图片的上传还可以用Java自带的HttpURLConnection来做上传处理,例如有一个PHP写的接收图片的POST接口http://localhost/upload/upload.php,参数如下:

name 名称

address 地点

img[] 图片(支持多张图片上传)

这时假如我们上传的参数为:

name值为this is the parameter:name

address值为this is the parameter:address

img[]的值为两张图片,路径为E:\Photos\test_1.jpg 和E:\Photos\test_2.jpg

那么我们写的POST网络请求的方法体应该为下面的格式:

-----------------------------7dc2fd5c0894

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

this is the parameter:name

-----------------------------7dc2fd5c0894

Content-Disposition: form-data; name="address"

this is the parameter:address

-----------------------------7dc2fd5c0894

Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_1.jpg"

Content-Type: image/pjpeg

<图片E:\Photos\test_1.jpg的二进制数据未显示>

---------------------------7dc2fd5c0894

Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_2.jpg"

Content-Type: image/pjpeg

<图片E:\Photos\test_2.jpg的二进制数据未显示 >

-----------------------------7dc2fd5c0894--

根据上面的格式我们写的上传图片的Java代码如下:

import 
          java.io.BufferedReader;
         
 
         

          import 
          java.io.DataInputStream;
         
 
         

          import 
          java.io.DataOutputStream;
         
 
         

          import 
          java.io.File;
         
 
         

          import 
          java.io.FileInputStream;
         
 
         

          import 
          java.io.InputStreamReader;
         
 
         

          import 
          java.io.OutputStream;
         
 
         

          import 
          java.net.HttpURLConnection;
         
 
         

          import 
          java.net.URL;
         
 
         

          import 
          java.util.ArrayList;
         
 
         

          import 
          java.util.List;
         
 
         

                                                  
          
 
         

          public 
          class 
          Main {
         
 
         

                                                  
          
 
         

             
          public 
          static 
          void 
          main(String[] args) {
         
 
         

                 
          List list = 
          new 
          ArrayList();
         
 
         

                 
          list.add(
          "E:\\Photos\\test_1.jpg"
          );
          //要上传的文件路径
         
 
         

                 
          list.add(
          "E:\\Photos\\test_2.jpg"
          );
          //要上传的文件路径
         
 
         

                                                  
          
 
         

                 
          upload(
          "this is the parameter:name"
          , 
          "this is the parameter:address"
          ,
         
 
         

                         
          list);
         
 
         

             
          }
         
 
         

                                                  
          
 
         

             
          public 
          static 
          void 
          upload(String name, String address, List list) {
         
 
         

                                                  
          
 
         

                 
          try 
          {
         
 
         

                     
          // 定义数据分隔线
         
 
         

                     
          String BOUNDARY = 
          "------------------------7dc2fd5c0894"
          ;
         
 
         

                     
          // 定义最后数据分隔线
         
 
         

                     
          byte
          [] end_data = (
          "\r\n--" 
          + BOUNDARY + 
          "--\r\n"
          ).getBytes();
         
 
         

                                                  
          
 
         

                     
          URL url = 
          new 
          URL(
          "http://localhost/upload/upload.php"
          );
         
 
         

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

                                                  
          
 
         

                     
          conn.setDoOutput(
          true
          );
         
 
         

                     
          conn.setDoInput(
          true
          );
         
 
         

                     
          conn.setUseCaches(
          false
          );
         
 
         

                     
          conn.setRequestMethod(
          "POST"
          );
         
 
         

                     
          conn.setRequestProperty(
          "connection"
          , 
          "Keep-Alive"
          );
         
 
         

                     
          conn.setRequestProperty(
          "user-agent"
          ,
         
 
         

                             
          "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"
          );
         
 
         

                     
          conn.setRequestProperty(
          "Charsert"
          , 
          "UTF-8"
          );
         
 
         

                     
          conn.setRequestProperty(
          "Content-Type"
          ,
         
 
         

                             
          "multipart/form-data; boundary=" 
          + BOUNDARY);
         
 
         

                                                  
          
 
         

                     
          OutputStream out = 
          new 
          DataOutputStream(conn.getOutputStream());
         
 
         

                                                  
          
 
         

                     
          // name参数
         
 
         

                     
          StringBuffer params = 
          new 
          StringBuffer();
         
 
         

                     
          params.append(
          "--" 
          + BOUNDARY + 
          "\r\n"
          );
         
 
         

                     
          params.append(
          "Content-Disposition: form-data; name=\"name\"\r\n\r\n"
          );
         
 
         

                     
          params.append(name);
         
 
         

                     
          params.append(
          "\r\n"
          );
         
 
         

                                                  
          
 
         

                     
          // address参数
         
 
         

                     
          params.append(
          "--" 
          + BOUNDARY + 
          "\r\n"
          );
         
 
         

                     
          params.append(
          "Content-Disposition: form-data; name=\"address\"\r\n\r\n"
          );
         
 
         

                     
          params.append(address);
         
 
         

                     
          params.append(
          "\r\n"
          );
         
 
         

                                                  
          
 
         

                     
          out.write(params.toString().getBytes());
         
 
         

                                                  
          
 
         

                     
          int 
          leng = list.size();
         
 
         

                     
          for 
          (
          int 
          i = 
          0
          ; i < leng; i++) {
         
 
         

                         
          String fname = list.get(i);
         
 
         

                         
          File file = 
          new 
          File(fname);
         
 
         

                                                  
          
 
         

                         
          StringBuilder sb = 
          new 
          StringBuilder();
         
 
         

                         
          sb.append(
          "--"
          );
         
 
         

                         
          sb.append(BOUNDARY);
         
 
         

                         
          sb.append(
          "\r\n"
          );
         
 
         

                         
          sb.append(
          "Content-Disposition: form-data;name=\"img[]\";filename=\""
         
 
         

                                 
          + file.getName() + 
          "\"\r\n"
          );
         
 
         

                         
          // 这里不能漏掉,根据文件类型来来做处理,由于上传的是图片,所以这里可以写成image/pjpeg
         
 
         

                         
          sb.append(
          "Content-Type:image/pjpeg\r\n\r\n"
          );
         
 
         

                         
          out.write(sb.toString().getBytes());
         
 
         

                                                  
          
 
         

                         
          DataInputStream in = 
          new 
          DataInputStream(
          new 
          FileInputStream(
         
 
         

                                 
          file));
         
 
         

                         
          int 
          bytes = 
          0
          ;
         
 
         

                         
          byte
          [] bufferOut = 
          new 
          byte
          [
          1024
          ];
         
 
         

                         
          while 
          ((bytes = in.read(bufferOut)) != -
          1
          ) {
         
 
         

                             
          out.write(bufferOut, 
          0
          , bytes);
         
 
         

                         
          }
         
 
         

                         
          out.write(
          "\r\n"
          .getBytes());
         
 
         

                         
          in.close();
         
 
         

                     
          }
         
 
         

                     
          out.write(end_data);
         
 
         

                     
          out.flush();
         
 
         

                     
          out.close();
         
 
         

                                                  
          
 
         

                     
          // 定义BufferedReader输入流来读取URL的响应
         
 
         

                     
          BufferedReader reader = 
          new 
          BufferedReader(
          new 
          InputStreamReader(
         
 
         

                             
          conn.getInputStream()));
         
 
         

                     
          String line = 
          null
          ;
         
 
         

                     
          while 
          ((line = reader.readLine()) != 
          null
          ) {
         
 
         

                         
          System.out.println(line);
         
 
         

                     
          }
         
 
         

                                                  
          
 
         

                 
          } 
          catch 
          (Exception e) {
         
 
         

                     
          System.out.println(
          "发送POST请求出现异常!" 
          + e);
         
 
         

                     
          e.printStackTrace();
         
 
         

                 
          }
         
 
         

             
          }
         
 
         

                                                  
          
 
         

          }


这样就可以把多张图片和参数上传到服务器了。当然这里只是一个演示,是用php写的接口并只是简单的把图图片保存在了接口文件的当前文件夹下;另外图片也没有做压缩,android手机上面上传时一般会做压缩,而且也不会一个接口上传多张图片,网络差时给用户的体验很不好,但是对于互联网开发者来说深入理解HTTP协议对表单是怎样处理的这个还是很重要

标签:java,name,conn,import,原理,Android,上传,append
From: https://blog.51cto.com/u_548275/6886059

相关文章

  • 上百个Android开源项目分享
    上百个Android开源项目分享,希望对android开发有帮助。AndroidPDF阅读器http://sourceforge.net/projects/andpdf/files/个人记账工具OnMyMeanshttp://sourceforge.net/projects/onmymeans/developAndroid电池监控AndroidBatteryDoghttp://sourceforge.net/projects/a......
  • 接口自动化--postman(1)工作原理及入门
    Postman是一个用于调试HTTP请求的工具,它提供了友好的界面帮助分析、构造HTTP请求,并分析响应数据。工作原理:Postman近似于一个浏览器,它可以模拟浏览器、APP原生等客户端向服务器发送接口请求,并获取接口的响应数据。  ......
  • Android开发者应该深入学习的10个…
    1.Android团队提供的示例项目 如果不是从学习AndroidSDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。 地址:http://code.google.com/p/......
  • Android JNI 编写方法
    JavaNativeInterface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。1.Java方式实现JNI,函数路径匹配......
  • Android图形系统之Surface、Surfac…
    1、SurfaceSurfaceextendsObjectimplementsParcelableClassOverviewHandleontoarawbufferthatisbeingmanagedbythescreencompositor.简单翻译:Surface是原始图像缓冲区(rawbuffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screencompositor)管理的。java.lan......
  • android与PC,C#与Java 利用protob…
    protobuf是什么? Protocolbuffers是一种编码方法构造的一种有效而可扩展的格式的数据。谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区。参考文档http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/overview.html  API的 参考文档 ......
  • Android中的Audio播放:竞争Audio…
    Android是多任务系统,Audio系统是竞争资源。Android2.2之前,没有内建的机制来解决多个程序竞争Audio的问题,2.2引入了称作AudioFocus的机制来管理对Audio资源的竞争的管理与协调。本文主要讲解AudioFocus的使用。按照AudioFocus的机制,在使用AudioStream之前,需要申请AudioFocus,在获得A......
  • android下面res目录使用
    res文件夹里面的多个文件夹的各自介绍(来自网上的Android开发指南中文版内容):  *res/raw和assets的相同点:目录Directory资源类型ResourceTypesres/anim/XML文件,它们被编译进逐帧动画(framebyframeanimation)或补间动画(tweenedanimation)对象res/drawable/.png、.9.png、.......
  • Android实现数据存储技术
    本文介绍Android中的5种数据存储方式。数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是:使用SharedPreferences存储数据; 文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据;下面将为大家一一详细介绍。第一种: ......
  • Android处理图片OOM的若干方法小结
    众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定)。因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片、音频文件、视频文件等多媒体资源;由于Android系统对音频、视频等资源做了边解析便播放的处理,使用时......