加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

从app上传图片到php,再上传到java后端服务器的方法一条龙服务

发布时间:2020-05-25 03:33:27 所属栏目:PHP 来源:互联网
导读:在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的。也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依葫芦画瓢就行了。好好了解下图片上传(文件

  在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的。也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依葫芦画瓢就行了。

  好好了解下图片上传(文件上传)的方式,对于认知的提升还是有好处的。而且说不定哪天你就有个这样的需求呢,这里是一条龙上传。

  本文就一个从app到php层,再到java层的流程,演译下整个上传图片的流程吧。

一、app端获取用户选择的图片,转化为输入流,上传至php前端接口:

<span style="color: #0000ff">import<span style="color: #000000"> java.io.DataOutputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.File;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.FileInputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.IOException;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.InputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.HttpURLConnection;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.MalformedURLException;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.URL;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.HashMap;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.Map;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.UUID;

<span style="color: #008000">/**<span style="color: #008000">

  • 上传文件到服务器类
    <span style="color: #008000">/
    <span style="color: #0000ff">public <span style="color: #0000ff">class<span style="color: #000000"> UploadUtil {
    <span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final String TAG = "uploadFile"<span style="color: #000000">;
    <span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final <span style="color: #0000ff">int TIME_OUT = 10
    1000; <span style="color: #008000">//<span style="color: #008000"> 超时时间
    <span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final String CHARSET = "utf-8"; <span style="color: #008000">//<span style="color: #008000"> 设置编码
    <span style="color: #008000">/**<span style="color: #008000">
    • Android上传文件到服务端
    • <span style="color: #808080">@param<span style="color: #008000"> file 需要上传的文件
    • <span style="color: #808080">@param<span style="color: #008000"> RequestURL 请求的rul
    • <span style="color: #808080">@return<span style="color: #008000"> 返回响应的内容
      <span style="color: #008000">*/
      <span style="color: #0000ff">public <span style="color: #0000ff">static<span style="color: #000000"> String uploadFile(File file,String RequestURL) {
      String result = <span style="color: #0000ff">null<span style="color: #000000">;
      String BOUNDARY = UUID.randomUUID().toString(); <span style="color: #008000">//<span style="color: #008000"> 边界标识 随机生成
      String PREFIX = "--",LINE_END = "rn"<span style="color: #000000">;
      String CONTENT_TYPE = "multipart/form-data"; <span style="color: #008000">//<span style="color: #008000"> 内容类型
      <span style="color: #0000ff">try<span style="color: #000000"> {
      URL url = <span style="color: #0000ff">new<span style="color: #000000"> URL(RequestURL);
      HttpURLConnection conn =<span style="color: #000000"> (HttpURLConnection) url.openConnection();
      conn.setReadTimeout(TIME_OUT);
      conn.setConnectTimeout(TIME_OUT);
      conn.setDoInput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输入流
      conn.setDoOutput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输出流
      conn.setUseCaches(<span style="color: #0000ff">false); <span style="color: #008000">//<span style="color: #008000"> 不允许使用缓存
      conn.setRequestMethod("POST"); <span style="color: #008000">//<span style="color: #008000"> 请求方式
      conn.setRequestProperty("Charset",CHARSET); <span style="color: #008000">//<span style="color: #008000"> 设置编码
      conn.setRequestProperty("connection","keep-alive"<span style="color: #000000">);
      conn.setRequestProperty("Content-Type",CONTENT_TYPE + ";boundary=" +<span style="color: #000000"> BOUNDARY);
      <span style="color: #0000ff">if (file != <span style="color: #0000ff">null<span style="color: #000000">) {
      DataOutputStream dos = <span style="color: #0000ff">new<span style="color: #000000"> DataOutputStream(conn.getOutputStream());
      StringBuffer sb = <span style="color: #0000ff">new<span style="color: #000000"> StringBuffer();
      sb.append(PREFIX);
      sb.append(BOUNDARY);
      sb.append(LINE_END);
      <span style="color: #008000">/**<span style="color: #008000">
      • 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
      • filename是文件的名字,包含后缀名的 比如:abc.png
        <span style="color: #008000">*/<span style="color: #000000">
        sb.append("Content-Disposition: form-data; name="uploadfile"; filename=""
        • file.getName() + """ +<span style="color: #000000"> LINE_END);
          sb.append("Content-Type: application/octet-stream; charset=" + CHARSET +<span style="color: #000000"> LINE_END);
          sb.append(LINE_END);
          dos.write(sb.toString().getBytes());
          InputStream is = <span style="color: #0000ff">new<span style="color: #000000"> FileInputStream(file);
          <span style="color: #0000ff">byte[] bytes = <span style="color: #0000ff">new <span style="color: #0000ff">byte[1024<span style="color: #000000">];
          <span style="color: #0000ff">int len = 0<span style="color: #000000">;
          <span style="color: #0000ff">while ((len = is.read(bytes)) != -1<span style="color: #000000">) {
          dos.write(bytes,0<span style="color: #000000">,len);
          }
          is.close();
          dos.write(LINE_END.getBytes());
          <span style="color: #0000ff">byte[] end_data = (PREFIX + BOUNDARY + PREFIX +<span style="color: #000000"> LINE_END).getBytes();
          dos.write(end_data);
          dos.flush();
          InputStream input =<span style="color: #000000"> conn.getInputStream();
          StringBuffer sb1 = <span style="color: #0000ff">new<span style="color: #000000"> StringBuffer();
          <span style="color: #0000ff">int<span style="color: #000000"> ss;
          <span style="color: #0000ff">while ((ss = input.read()) != -1<span style="color: #000000">) {
          sb1.append((<span style="color: #0000ff">char<span style="color: #000000">) ss);
          }
          result =<span style="color: #000000"> sb1.toString();
          }
          } <span style="color: #0000ff">catch<span style="color: #000000"> (MalformedURLException e) {
          e.printStackTrace();
          } <span style="color: #0000ff">catch<span style="color: #000000"> (IOException e) {
          e.printStackTrace();
          }
          <span style="color: #0000ff">return<span style="color: #000000"> result;
          }
          <span style="color: #008000">/**<span style="color: #008000">
    • 通过拼接的方式构造请求内容,实现参数传输以及文件传输
    • <span style="color: #808080">@param<span style="color: #008000"> url Service net address
    • <span style="color: #808080">@param<span style="color: #008000"> params text content
    • <span style="color: #808080">@param<span style="color: #008000"> files pictures
    • <span style="color: #808080">@return<span style="color: #008000"> String result of Service response
    • <span style="color: #808080">@throws<span style="color: #008000"> IOException
      <span style="color: #008000">/
      <span style="color: #0000ff">public <span style="color: #0000ff">static String post(String url,Map<String,String> params,File><span style="color: #000000"> files)
      <span style="color: #0000ff">throws<span style="color: #000000"> IOException {
      String BOUNDARY =<span style="color: #000000"> UUID.randomUUID().toString();
      String PREFIX = "--",LINEND = "rn"<span style="color: #000000">;
      String MULTIPART_FROM_DATA = "multipart/form-data"<span style="color: #000000">;
      String CHARSET = "UTF-8"<span style="color: #000000">;
      URL uri = <span style="color: #0000ff">new<span style="color: #000000"> URL(url);
      HttpURLConnection conn =<span style="color: #000000"> (HttpURLConnection) uri.openConnection();
      conn.setReadTimeout(10
      1000); <span style="color: #008000">//<span style="color: #008000"> 缓存的最长时间
      conn.setDoInput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输入
      conn.setDoOutput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输出
      conn.setUseCaches(<span style="color: #0000ff">false); <span style="color: #008000">//<span style="color: #008000"> 不允许使用缓存
      conn.setRequestMethod("POST"<span style="color: #000000">);
      conn.setRequestProperty("connection","keep-alive"<span style="color: #000000">);
      conn.setRequestProperty("Charsert","UTF-8"<span style="color: #000000">);
      conn.setRequestProperty("Content-Type",MULTIPART_FROM_DATA + ";boundary=" +<span style="color: #000000"> BOUNDARY);
      <span style="color: #008000">//<span style="color: #008000"> 首先组拼文本类型的参数
      StringBuilder sb = <span style="color: #0000ff">new<span style="color: #000000"> StringBuilder();
      <span style="color: #0000ff">for (Map.Entry<String,String><span style="color: #000000"> entry : params.entrySet()) {
      sb.append(PREFIX);
      sb.append(BOUNDARY);
      sb.append(LINEND);
      sb.append("Content-Disposition: form-data; name="" + entry.getKey() + """ +<span style="color: #000000"> LINEND);
      sb.append("Content-Type: text/plain; charset=" + CHARSET +<span style="color: #000000"> LINEND);
      sb.append("Content-Transfer-Encoding: 8bit" +<span style="color: #000000"> LINEND);
      sb.append(LINEND);
      sb.append(entry.getValue());
      sb.append(LINEND);
      }
      DataOutputStream outStream = <span style="color: #0000ff">new<span style="color: #000000"> DataOutputStream(conn.getOutputStream());
      outStream.write(sb.toString().getBytes());
      <span style="color: #008000">//<span style="color: #008000"> 发送文件数据
      <span style="color: #0000ff">if (files != <span style="color: #0000ff">null<span style="color: #000000">)
      <span style="color: #0000ff">for (Map.Entry<String,File><span style="color: #000000"> file : files.entrySet()) {
      StringBuilder sb1 = <span style="color: #0000ff">new<span style="color: #000000"> StringBuilder();
      sb1.append(PREFIX);
      sb1.append(BOUNDARY);
      sb1.append(LINEND);
      sb1.append("Content-Disposition: form-data; name="uploadfile"; filename=""
      • file.getValue().getName() + """ +<span style="color: #000000"> LINEND);
        sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET +<span style="color: #000000"> LINEND);
        sb1.append(LINEND);
        outStream.write(sb1.toString().getBytes());
        InputStream is = <span style="color: #0000ff">new<span style="color: #000000"> FileInputStream(file.getValue());
        <span style="color: #0000ff">byte[] buffer = <span style="color: #0000ff">new <span style="color: #0000ff">byte[1024<span style="color: #000000">];
        <span style="color: #0000ff">int len = 0<span style="color: #000000">;
        <span style="color: #0000ff">while ((len = is.read(buffer)) != -1<span style="color: #000000">) {
        outStream.write(buffer,len);
        }
        is.close();
        outStream.write(LINEND.getBytes());
        }
        <span style="color: #0000ff">byte[] end_data = (PREFIX + BOUNDARY + PREFIX +<span style="color: #000000"> LINEND).getBytes();
        outStream.write(end_data);
        outStream.flush();
        <span style="color: #0000ff">int res =<span style="color: #000000"> conn.getResponseCode();
        InputStream in =<span style="color: #000000"> conn.getInputStream();
        StringBuilder sb2 = <span style="color: #0000ff">new<span style="color: #000000"> StringBuilder();
        <span style="color: #0000ff">if (res == 200<span style="color: #000000">) {
        <span style="color: #0000ff">int<span style="color: #000000"> ch;
        <span style="color: #0000ff">while ((ch = in.read()) != -1<span style="color: #000000">) {
        sb2.append((<span style="color: #0000ff">char<span style="color: #000000">) ch);
        }
        }
        outStream.close();
        conn.disconnect();
        <span style="color: #0000ff">return<span style="color: #000000"> sb2.toString();
        }
        <span style="color: #008000">//<span style="color: #008000"> 测试
        <span style="color: #0000ff">public <span style="color: #0000ff">static <span style="color: #0000ff">void main(String[] args) <span style="color: #0000ff">throws<span style="color: #000000"> IOException {
        String requestURL = "sss"<span style="color: #000000">;
        <span style="color: #0000ff">final Map<String,String> params = <span style="color: #0000ff">new HashMap<String,String><span style="color: #000000">();
        params.put("send_userId",String.valueOf(1<span style="color: #000000">));
        params.put("send_email","ss@ss.com"<span style="color: #000000">);
        <span style="color: #0000ff">final Map<String,File> files = <span style="color: #0000ff">new HashMap<String,File><span style="color: #000000">();
        files.put("uploadfile",<span style="color: #0000ff">new File("/var/data/de.jpg"<span style="color: #000000">));
        <span style="color: #0000ff">final String result =<span style="color: #000000"> UploadUtil.post(requestURL,params,files);
        System.out.println("result is: " +<span style="color: #000000"> result);
        }
        }

        二、php服务端接收文件,临时保存并继续上传至java后端:

          1. 接收文件类

    <span style="color: #0000ff">use<span style="color: #000000"> ActionRestAction;
    <span style="color: #0000ff">use<span style="color: #000000"> ApiUploadApi;

    (编辑:安卓应用网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读