1. 程式人生 > >傳送指定form-data資料

傳送指定form-data資料

之前遇到在java 後臺傳送form-data 格式資料到PHP介面的問題,找了好多方法都沒行的通,後來看到一個很好的方法,才發現想要傳送form-data 格式的資料,每個引數之間的書需要分隔的,卡了很久......

 // 每個post引數之間的分隔。隨意設定,只要不會和其他的字串重複即可。
    private static final String BOUNDARY = "----------HV2ymHFg03ehbqgZCaKO6jyH";

    public static String sendHttpPostRequest(String serverUrl,
                                      ArrayList<FormFieldKeyValuePair> generalFormFields
            ) throws Exception {
        // 向伺服器傳送post請求
        URL url = new URL(serverUrl/* "http://127.0.0.1:8080/test/upload" */);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 傳送POST請求必須設定如下兩行
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Charset", "UTF-8");
        connection.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + BOUNDARY);
        // 頭
        String boundary = BOUNDARY;

        // 傳輸內容
        StringBuffer contentBody = new StringBuffer("--" + BOUNDARY);

        // 尾
        String endBoundary = "\r\n--" + boundary + "--\r\n";
        OutputStream out = connection.getOutputStream();
        // 處理文字形式的POST請求
        for (FormFieldKeyValuePair ffkvp : generalFormFields)

        {

            contentBody.append("\r\n")
                    .append("Content-Disposition: form-data; name=\"")
                    .append(ffkvp.getKey() + "\"")
                    .append("\r\n")
                    .append("\r\n")
                    .append(ffkvp.getValue())
                    .append("\r\n")
                    .append("--")
                    .append(boundary);

        }

        String boundaryMessage1 = contentBody.toString();
        out.write(boundaryMessage1.getBytes("utf-8"));
        out.write(endBoundary.getBytes("utf-8"));
        out.flush();
        out.close();

        // 從伺服器獲得回答的內容
        String strLine = "";
        String strResponse = "";
        InputStream in = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        while ((strLine = reader.readLine()) != null)
        {
            strResponse += strLine + "\n";
        }
        // System.out.print(strResponse);
        return strResponse;

    }
同時,該方法還可以新增上傳檔案的功能
//  處理檔案上傳 需要傳一個ArrayList<UploadFileItem> filesToBeUploaded引數
       for (UploadFileItem ufi : filesToBeUploaded)
        {
            contentBody = new StringBuffer();
            contentBody.append("\r\n")
                   .append("Content-Disposition:form-data; name=\"")
                    .append(ufi.getFormFieldName() + "\"; ") // form中field的名稱
                    .append("filename=\"")
                    .append(ufi.getFileName() + "\"") // 上傳檔案的檔名,包括目錄
                    .append("\r\n")
                    .append("Content-Type:application/octet-stream")
                    .append("\r\n\r\n");

            String boundaryMessage2 = contentBody.toString();
            out.write(boundaryMessage2.getBytes("utf-8"));
            // 開始真正向伺服器寫檔案
            File file = new File(ufi.getFileName());
            DataInputStream dis = new DataInputStream(new FileInputStream(file));
            int bytes = 0;
            byte[] bufferOut = new byte[(int) file.length()];
            bytes = dis.read(bufferOut);
            out.write(bufferOut, 0, bytes);
            dis.close();
            contentBody.append("------------HV2ymHFg03ehbqgZCaKO6jyH");
            String boundaryMessage = contentBody.toString();
            out.write(boundaryMessage.getBytes("utf-8"));
            // System.out.println(boundaryMessage);
        }
        out.write("------------HV2ymHFg03ehbqgZCaKO6jyH--\r\n"
                .getBytes("UTF-8"));
form 鍵值對實體類
@ToString
@[email protected]
@AllArgsConstructor
public class FormFieldKeyValuePair {
    private static final long serialVersionUID = 1L;
    private String key;
    private Object value;
}
form 檔案實體類
@ToString
@[email protected]
@AllArgsConstructor
public class UploadFileItem implements Serializable {
    private static final long serialVersionUID = 1L;

    // The form field name in a form used foruploading a file,
    // such as "upload1" in "<inputtype="file" name="upload1"/>"
    private String formFieldName;

    // File name to be uploaded, thefileName contains path,
    // such as "E:\\some_file.jpg"
    private String fileName;

}


相關推薦

傳送指定form-data資料

之前遇到在java 後臺傳送form-data 格式資料到PHP介面的問題,找了好多方法都沒行的通,後來看到一個很好的方法,才發現想要傳送form-data 格式的資料,每個引數之間的書需要分隔的,卡了很久...... // 每個post引數之間的分隔。隨意設定,只要不會

Python 傳送 multipart/form-data 資料

前言 最近做知乎模擬登入的時候,碰到一個很奇怪的引數型別,與一般的鍵值對不同,大概長這樣: ------WebKitFormBoundaryA0Srut8TBztAofvx Content-Disposition: form-data; name="cl

HttpClient:模擬表單提交檔案,傳送multipart/form-data資料

使用HttpClient來模擬表單提交,傳送檔案 常用於非web客戶端與web後端傳輸檔案 1.pom <dependencies> <!-- https://m

multipart/form-data 獲取form-data資料--java

表單資料都儲存在http的正文部分,各個表單項之間用boundary隔開。格式類似於下面這樣:用request.getParameter是取不到資料的,這時需要通過request.getInputStream來取資料,不過取到的是個InputStream,所以無法直接獲取指定的表單項(需要自己對取到

requests傳送multipart/form-data請求(檔案)

在寫爬蟲有時候會發現這種請求資料,其實就是一個上傳圖片的請求。 def send_file(user,user_key,tousername,file,cookice): ''' 傳送檔案表情之類 :param user: 傳送訊息的使用者 [{'FromUserName

獲取postman的form-data資料的中介軟體

記錄一下獲取postman的form-data資料的中介軟體 var express = require(‘express’); var bodyParser = require(‘body-parser’); var multer = require(‘multer’); var app

前端提交multipart/form-data資料,由api服務A將請求轉發到api服務B

maven依賴: <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactI

怎麼使用okhttp的form-data資料型別對接介面

maven專案使用依賴: <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId>

微信小程式傳送post請求data資料後臺獲取不到

    今天遇到一個比較奇怪的問題,在傳送post請求併發送data資料給後端,但是後端一直無法獲取,前面傳送一樣的post請求(只是頁面不同,傳的data資料不同)就能獲取到,卡了好一會兒,總算髮現了原因。問題出在了請求的 header選項那, 預設的header選項'co

HTTP協議之post multipart/form-data資料型別例項

首先,說這個問題之前吐槽一下網上的文章,做這個東西的時候幾乎看了所有的部落格,沒一個說到點上的,太籠統,也不完整,我就在想等我做好一定要寫篇完整的文章,其實最好的原始碼就是提供的demo。 1、先說下問題背景 http://help.robotscloud.com/book

解決python傳送multipart/form-data請求上傳檔案的問題

    #coding=utf8 import requests from uuid import uuid4 import os file_name='test' url= boundary=uuid4().hex header={'Content-Typ

Java HttpClient 傳送multipart/form-data帶有Json檔案的Post請求

Java HttpClient 傳送multipart/form-data帶有Json檔案的Post請求說明:傳送multipart/form-data帶有Json檔案的Post請求,檔案內容其實就是j

使用python2實現http multipart/form-data資料傳輸

Python3貌似有比較方便的方式,Python2得自己寫點程式碼。 程式碼基本上參考了一位仁兄釋出在github上的程式碼,但是找不到他的連結了,對不住。不過他的程式碼貌似跑不過,我這裡做了修改後,釋出在這裡,希望對後來人有幫助。 其實最重要的還是要了解http有關這部分

使用HttpClient4,post提交multipart/form-data資料

問題由來:   在Vert.x的專案中,進行公眾號開發的時候,發現回覆使用者圖片的時候需要先上傳圖片,獲取一個media_id,然後拿著這個media_id去傳送資料。   問題是,Vert.x的vertx-web-client不提供表單檔案上傳(form-data)方式p

multipart/form-data 獲取form-data資料--java

表單資料都儲存在http的正文部分,各個表單項之間用boundary隔開。格式類似於下面這樣:用request.getParameter是取不到資料的,這時需要通過request.getInputStream來取資料,不過取到的是個InputStream,所以無法直接獲取指定

使用python的requests 傳送multipart/form-data 請求

 網上關於使用python 的傳送multipart/form-data的方法,多半是採用 ulrlib2 的模擬post方法,如下: import urllib2 boundary='-------------------------7df3069603d6' data=

python requests傳送multipart/form-data編碼

安裝requests_toolbelt pip install requests-toolbelt 程式碼 傳送檔案中的資料 from requests_toolbelt imp

從零開始實現multipart/form-data資料提交

在HTTP服務應用中進行資料提交一般都使用application/json,application/x-www-form-urlencoded和multipart/form-data這幾種內容格式。這幾種格式的處理複雜度處理起來和前面定義的先後順序一樣由易到難。不過現有工具都提供了完善的功能在提交這些資料的時

jQuery.ajax設定請求頭實現post請求傳送資料的格式(Form Data和Request Payload)

 Request Payload 請求頭部的 Content-Type: application/json,請求正文是一個 json 格式的字串 Form Data 請求頭部的 Content-Typ

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下:

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.soh