第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

POST 文件(作為二進(jìn)制流)使用 java.net.HttpURLConnection 作為參數(shù)

POST 文件(作為二進(jìn)制流)使用 java.net.HttpURLConnection 作為參數(shù)

飲歌長(zhǎng)嘯 2023-02-23 17:29:53
我正在嘗試使用 java.net.HttpURLConnection 將文件上傳 (POST) 到端點(diǎn),但我一直收到 http 代碼 400(錯(cuò)誤請(qǐng)求)。我參考了在 android API 23 中使用 HttpURLConnection 將文件和參數(shù)發(fā)送到服務(wù)器但問(wèn)題是我需要將此文件作為請(qǐng)求正文參數(shù) (file=) 發(fā)送。注意:這些文件只有很小的尺寸(4-5mb)所以我完全在內(nèi)存中閱讀它。對(duì)應(yīng)的 curl 請(qǐng)求為:curl -X POST "API" -H "Content-Type: multipart/form-data" -F "file="我正在使用的代碼摘錄:    Proxy webproxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("                                 <proxy host>", <proxy_port>));    HttpURLConnection http_conn = (HttpURLConnection)                                      url.openConnection(webproxy);    String authorization = getAuthorization(access_token);    http_conn.setRequestMethod("POST");    http_conn.setRequestProperty("Accept-Charset", "UTF-8");            http_conn.setRequestProperty("Authorization", authorization);    http_conn.setRequestProperty("Connection", "Keep-Alive");    http_conn.setRequestProperty("Content-Type", "multipart/form-data);      http_conn.setDoOutput(true);    http_conn.setDoInput(true);    DataOutputStream outputStream;    outputStream = new DataOutputStream(http_conn.getOutputStream());    File file_obj = new File(this.file);                                    byte[] allBytes = new byte[(int) file_obj.length()];    FileInputStream fileInputStream = new FileInputStream(file_obj);                    outputStream.write("file=".getBytes("UTF-8")); <---Trying to add file param here    fileInputStream.read(allBytes);    outputStream.write(allBytes);發(fā)布我剛剛使用下面的代碼讀取響應(yīng)(適用于不同的 GET 請(qǐng)求):    InputStream inputStream = http_conn.getInputStream();                    BufferedReader bufferedReader = new BufferedReader(new     InputStreamReader(inputStream));    String line = "";                while ((line = bufferedReader.readLine()) != null) {        data = data + line;                    }注意:我很少使用 java,對(duì)它不是很熟悉,所以請(qǐng)?jiān)谀幕貜?fù)中進(jìn)行描述。
查看完整描述

2 回答

?
交互式愛(ài)情

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊

當(dāng)查看您的 curl 命令行時(shí),它表明該文件需要作為請(qǐng)求發(fā)送multipart/form-data。這實(shí)際上是一種在需要時(shí)格式化數(shù)據(jù)的復(fù)雜方法。

您需要發(fā)送的格式示例是:

標(biāo)頭:

Content-Type:?multipart/form-data;?boundary=AaB03x

身體:

--AaB03x
Content-Disposition:?form-data;?name="files";
?filename="file1.txt"Content-Type:?text/plain

...?contents?of?file1.txt?...
--AaB03x--

目前,您的代碼正在將文件作為 POST/GET 格式的請(qǐng)求發(fā)送,這不起作用,因?yàn)楹蠖瞬幌M@樣做。

為了解決這個(gè)問(wèn)題,我們需要將源文件格式化成后端需要的格式,一旦知道“boundary”頭選項(xiàng)只是一個(gè)隨機(jī)生成的值,發(fā)送請(qǐng)求就變得容易多了。

String boundary = "MY_AWESOME_BOUNDARY"

http_conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);??


try(DataOutputStream outputStream = new DataOutputStream(http_conn.getOutputStream())) {

? ? File file_obj = new File(this.file);? ? ? ? ? ? ? ? ? ? ??


? ? // Write form-data header? ?

? ? outputStream.write(("--" + boundary + "\r\n").getBytes("UTF-8"));

? ? outputStream.write(("Content-Disposition: form-data; name=\"file\"; filename=\"file1.txt\"\r\n").getBytes("UTF-8"));

? ? outputStream.write(("Content-Type: text/plain\r\n").getBytes("UTF-8"));

? ? outputStream.write(("\r\n").getBytes("UTF-8"));

? ? // Write form-data body

? ? Files.copy(file_obj.toPath(), outputStream)

? ? // Write form-data "end"

? ? outputStream.write(("--" + boundary + "--\r\n").getBytes("UTF-8"));

}

// Read backend response here

try(InputStream inputStream = http_conn.getInputStream()) {? ? ? ? ? ?

? ? BufferedReader bufferedReader = new BufferedReader(new?

? ? InputStreamReader(inputStream));

? ? StringBuilder lines = new StringBuilder(); // StringBuilder is faster for concatination than appending strings? ? ? ? ? ?

? ? while ((line = bufferedReader.readLine()) != null) {

? ? ? ? lines.append(line);? ? ? ? ? ? ? ??

? ? }

? ? System.out.println(lines);

}

請(qǐng)注意,我使用了“try-with-resource”塊,這些塊確保在您使用完它們后關(guān)閉和處置任何外部資源,與內(nèi)存量相比,通常操作系統(tǒng)的開(kāi)放資源限制非常低你的程序有,所以發(fā)生的是你的程序可能會(huì)出現(xiàn)奇怪的錯(cuò)誤,這些錯(cuò)誤只會(huì)在運(yùn)行一段時(shí)間后或用戶在你的應(yīng)用程序中執(zhí)行某些操作時(shí)發(fā)生


查看完整回答
反對(duì) 回復(fù) 2023-02-23
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

以上對(duì)我沒(méi)有用,所以我切換到不同的包(okhttp3),這是對(duì)我有用的:


    File file_obj = new File(this.file); 

    String authorization = "my authorization string";

    Proxy webproxy = new Proxy(Proxy.Type.HTTP, new 

          InetSocketAddress("proxy", <port>));


    OkHttpClient client = new OkHttpClient.Builder().proxy(webproxy).build();      


    RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", "filename",

        RequestBody.create(MediaType.parse("application/octet-stream"), file_obj)).build();


    Request request = new Request.Builder().header("Authorization", authorization).url(this.url).post(requestBody).build();


    try (Response response = client.newCall(request).execute()){

        if(!response.isSuccessful()) return "NA";

        return (response.body().string());

    }


查看完整回答
反對(duì) 回復(fù) 2023-02-23
  • 2 回答
  • 0 關(guān)注
  • 409 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)