Android使用http協議實現文件的上傳

fmms 12年前發布 | 106K 次閱讀 Android Android開發 移動開發

http協議上傳文件一般最大是2M,比較適合上傳小于兩M的文件

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

/**

  • 上傳的文件 /
    public class FormFile {
    /** 上傳文件的數據
    /
    private byte[] data;
    private InputStream inStream;
    private File file;
    / 文件名稱 */
    private String filname;
    /
    請求參數名稱/
    private String parameterName;
    /** 內容類型
    /
    private String contentType = "application/octet-stream";
    /**
    • @param filname 文件名稱
    • @param data 上傳的文件數據
    • @param parameterName 參數
    • @param contentType 內容類型 */
      public FormFile(String filname, byte[] data, String parameterName, String contentType) {
      this.data = data;
      this.filname = filname;
      this.parameterName = parameterName;
      if(contentType!=null) this.contentType = contentType;
      }
      /**
    • @param filname 文件名
    • @param file 上傳的文件
    • @param parameterName 參數
    • @param contentType 內容內容類型 */
      public FormFile(String filname, File file, String parameterName, String contentType) {
      this.filname = filname;
      this.parameterName = parameterName;
      this.file = file;
      try {
      this.inStream = new FileInputStream(file);
      } catch (FileNotFoundException e) {
      e.printStackTrace();
      }
      if(contentType!=null) this.contentType = contentType;
      }

public File getFile() {
return file;
}

public InputStream getInStream() {
return inStream;
}

public byte[] getData() {
return data;
}

public String getFilname() {
return filname;
}

public void setFilname(String filname) {
this.filname = filname;
}

public String getParameterName() {
return parameterName;
}

public void setParameterName(String parameterName) {
this.parameterName = parameterName;
}

public String getContentType() {
return contentType;
}

public void setContentType(String contentType) {
this.contentType = contentType;
}

}

/**

  • 直接通過HTTP協議提交數據到服務器,實現如下面表單提交功能:
  • <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do&quot; enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input type="file" name="zip"/> </FORM>
  • @param path 上傳路徑(注:避免使用localhost或127.0.0.1這樣的路徑測試,因為它會指向手機模擬器,你可以使用http://www.xxx.cn或http://192.168.1.10:8080這樣的路徑測試)
  • @param params 請求參數 key為參數名,value為參數值
  • @param file 上傳文件 */
    public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{
    final String BOUNDARY = "---------------------------7da2137580612"; //數據分隔線
    final String endline = "--" + BOUNDARY + "--\r\n";//數據結束標志

    int fileDataLength = 0;
    for(FormFile uploadFile : files){//得到文件類型數據的總長度
    StringBuilder fileExplain = new StringBuilder();
    fileExplain.append("--");
    fileExplain.append(BOUNDARY);
    fileExplain.append("\r\n");
    fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
    fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
    fileExplain.append("\r\n");
    fileDataLength += fileExplain.length();
    if(uploadFile.getInStream()!=null){

     fileDataLength += uploadFile.getFile().length();  
    

    }else{

     fileDataLength += uploadFile.getData().length;  
    

    }
    }
    StringBuilder textEntity = new StringBuilder();
    for (Map.Entry<String, String> entry : params.entrySet()) {//構造文本類型參數的實體數據
    textEntity.append("--");
    textEntity.append(BOUNDARY);
    textEntity.append("\r\n");
    textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
    textEntity.append(entry.getValue());
    textEntity.append("\r\n");
    }
    //計算傳輸給服務器的實體數據總長度
    int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;

    URL url = new URL(path);
    int port = url.getPort()==-1 ? 80 : url.getPort();
    Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);
    OutputStream outStream = socket.getOutputStream();
    //下面完成HTTP請求頭的發送
    String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";
    outStream.write(requestmethod.getBytes());
    String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /\r\n";
    outStream.write(accept.getBytes());
    String language = "Accept-Language: zh-CN\r\n";
    outStream.write(language.getBytes());
    String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";
    outStream.write(contenttype.getBytes());
    String contentlength = "Content-Length: "+ dataLength + "\r\n";
    outStream.write(contentlength.getBytes());
    String alive = "Connection: Keep-Alive\r\n";
    outStream.write(alive.getBytes());
    String host = "Host: "+ url.getHost() +":"+ port +"\r\n";
    outStream.write(host.getBytes());
    //寫完HTTP請求頭后根據HTTP協議再寫一個回車換行
    outStream.write("\r\n".getBytes());
    //把所有文本類型的實體數據發送出來
    outStream.write(textEntity.toString().getBytes());
    //把所有文件類型的實體數據發送出來
    for(FormFile uploadFile : files){
    StringBuilder fileEntity = new StringBuilder();
    fileEntity.append("--");
    fileEntity.append(BOUNDARY);
    fileEntity.append("\r\n");
    fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
    fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
    outStream.write(fileEntity.toString().getBytes());
    if(uploadFile.getInStream()!=null){

     byte[] buffer = new byte[1024];  
     int len = 0;  
     while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){  
     outStream.write(buffer, 0, len);  
     }  
     uploadFile.getInStream().close();  
    

    }else{

     outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);  
    

    }
    outStream.write("\r\n".getBytes());
    }
    //下面發送數據結束標志,表示數據已經結束
    outStream.write(endline.getBytes());

    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    if(reader.readLine().indexOf("200")==-1){//讀取web服務器返回的數據,判斷請求碼是否為200,如果不是200,代表請求失敗
    return false;
    }
    outStream.flush();
    outStream.close();
    reader.close();
    socket.close();
    return true;
    }

/**

  • 提交數據到服務器
  • @param path 上傳路徑(注:避免使用localhost或127.0.0.1這樣的路徑測試,因為它會指向手機模擬器,你可以使用http://www.xxx.cn或http://192.168.1.10:8080這樣的路徑測試)
  • @param params 請求參數 key為參數名,value為參數值
  • @param file 上傳文件
    */
    public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception{
    return post(path, params, new FormFile[]{file});
    } </pre>
 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!