」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 java.net.URLConnection 將檔案和附加參數上傳到 HTTP 伺服器?

如何使用 java.net.URLConnection 將檔案和附加參數上傳到 HTTP 伺服器?

發佈於2024-11-07
瀏覽:617

How to upload files and additional parameters to an HTTP server using java.net.URLConnection?

在 Java 中使用附加參數將檔案上傳到 HTTP 伺服器

將檔案上傳到 HTTP 伺服器是許多應用程式的常見需求。但是,有時也需要隨文件一起傳遞附加參數。這是一個允許您在不使用外部庫的情況下發送文件和參數的解決方案:

java.net.URLConnection 和Multipart/Form-Data

傳送檔案和參數,您將利用java.net.URLConnection 並採用multipart/form-data 編碼。 Multipart/form-data 可讓您在單一 HTTP 請求中混合二進位資料(檔案)和字元資料(參數)。

範例程式碼:

String url = "http://example.com/upload";
String charset = "UTF-8";
String param = "value";
File textFile = new File("/path/to/file.txt");
File binaryFile = new File("/path/to/file.bin");
String boundary = Long.toHexString(System.currentTimeMillis());
String CRLF = "\r\n";

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="   boundary);

try (
    OutputStream output = connection.getOutputStream();
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
) {
    // Send normal param.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset="   charset).append(CRLF);
    writer.append(CRLF).append(param).append(CRLF).flush();

    // Send text file.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\""   textFile.getName()   "\"").append(CRLF);
    writer.append("Content-Type: text/plain; charset="   charset).append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(textFile.toPath(), output);
    output.flush(); 
    writer.append(CRLF).flush();

    // Send binary file.
    writer.append("--"   boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\""   binaryFile.getName()   "\"").append(CRLF);
    writer.append("Content-Type: "   URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
    writer.append("Content-Transfer-Encoding: binary").append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(binaryFile.toPath(), output);
    output.flush(); 
    writer.append(CRLF).flush();

    // End of multipart/form-data.
    writer.append("--"   boundary   "--").append(CRLF).flush();
}

// Request is lazily fired whenever you need to obtain information about response.
int responseCode = ((HttpURLConnection) connection).getResponseCode();
System.out.println(responseCode); 

附加說明:

  • 確保為每個多部分請求提供唯一的邊界值。
  • 檔案必須採用指定的字元集發送 Content-Type 標頭。
  • Apache Commons HttpComponents Client 可以進一步簡化這個過程,但這不是必要的。

參考:

  • [使用java.net.URLConnection 觸發和處理HTTP 請求](https://docs.oracle.com/ javase/tutorial/networking/urls/creating-urls.html)
最新教學 更多>
  • 為什麼我的 Java 應用程式使用 GMT 而不是作業系統時區,如何修復它?
    為什麼我的 Java 應用程式使用 GMT 而不是作業系統時區,如何修復它?
    如何解決Java 中預設時區不正確的問題在某些情況下,Java 應用程式可能會遇到JVM 時區預設為GMT 的問題作業系統(OS) 定義的時區。這可能會導致日期和時間處理不正確。 在 Windows Server Enterprise (2007) 上執行的 Java 開發工具包 (JDK) 版本 ...
    程式設計 發佈於2024-11-07
  • 如何將 AWS SDK v2 與變數憑證結合使用?
    如何將 AWS SDK v2 與變數憑證結合使用?
    使用變數中的憑證執行 AWS SDK v2問:如何使用變數中的憑證執行 AWS SDK v2? 要利用 SDK v2 而不使用舊的 Session 類,您可以建立一個新客戶端並將您的憑證作為變數傳遞。考慮 IAM 服務的 getIAMClient 函數:func getIAMClient(ctx c...
    程式設計 發佈於2024-11-07
  • 為什麼我的 Java 專案找不到「tools.jar」?
    為什麼我的 Java 專案找不到「tools.jar」?
    Java專案中缺少Tools.jar在複雜的Java程式設計中,您可能會遇到“無法找到tools.jar”的神秘問題「錯誤。當您的專案缺少編譯和執行所必需的關鍵組件時,通常會出現此錯誤。診斷難題 檢查錯誤訊息後,您會發現系統正在運作無法在預期位置找到「tools.jar」檔案:C:\Program ...
    程式設計 發佈於2024-11-07
  • 我什麼時候應該在資料庫系統中使用 MySQL BLOB 進行檔案管理?
    我什麼時候應該在資料庫系統中使用 MySQL BLOB 進行檔案管理?
    何時利用MySQL BLOB 進行檔案管理在資料庫管理中,處理檔案儲存時,出現兩個主要選項:檔案系統儲存或MySQL BLOB(二進位大型)物件)存儲。每種方法都有其優點和局限性,但選擇最佳方法取決於應用程式的特定要求。 效能注意事項在某些情況下,使用 BLOB 可以顯著提高效能。當同時從多個伺服器...
    程式設計 發佈於2024-11-07
  • 如何在 Java 中轉義特殊字元以實現精確的正規表示式匹配?
    如何在 Java 中轉義特殊字元以實現精確的正規表示式匹配?
    轉義特殊字元以實現最佳正則表達式匹配使用正則表達式(regex) 匹配文本時,轉義某有些特殊字元至關重要,以確保它們被解釋為文字而不是元字元。在Java中,必須轉義的特殊字元包括:。 [ ] { } ( ) \ < > * - = ! ? ^ $ |但是,需要注意一些例外情況:方括號([]) 內只有...
    程式設計 發佈於2024-11-07
  • 用 Java 建立旋轉排序數組搜尋:了解樞軸搜尋和二分搜尋
    用 Java 建立旋轉排序數組搜尋:了解樞軸搜尋和二分搜尋
    什麼是旋轉排序數組? 考慮一個排序數組,例如: [1, 2, 3, 4, 5, 6] 現在,如果這個陣列在某個樞軸處旋轉,例如在索引 3 處,它將變成: [4, 5, 6, 1, 2, 3] 請注意,陣列仍然是排序的,但它被分成兩部分。我們的目標是有效地在此類數組中搜尋目標值。 ...
    程式設計 發佈於2024-11-07
  • 在 � 學習 Three.js
    在 � 學習 Three.js
    I had the chance to dive into some web development where I wanted to add interactive 3D elements that could move and react to certain triggers. Natura...
    程式設計 發佈於2024-11-07
  • 網站時間資料集
    網站時間資料集
    您好,我在kaggle上發現了一個網站使用時間的資料集,所以我想找到訪問頁面數與網站總時間之間的比率。 您可以在我的github中找到資料集和程式碼:https://github.com/victordalet/Kaggle_analysis/tree/feat/website_traffic ...
    程式設計 發佈於2024-11-07
  • 簡單異常範例
    簡單異常範例
    此範例顯示如何監控和捕捉異常。 嘗試存取陣列邊界以外的索引會產生 ArrayIndexOutOfBoundsException。 程式故意引發此異常並捕獲它。 要監視異常的程式碼放在 try 區塊內。 當發生異常時,拋出異常並被catch塊捕獲,結束try塊。 控制權不是「叫」來捕捉的,...
    程式設計 發佈於2024-11-07
  • 模板文字可以真正重複使用嗎?
    模板文字可以真正重複使用嗎?
    模板文字:復興重用ES6 中的模板文字經常被吹捧為強大的文本操作工具,但一個棘手的問題仍然存在:它們真的可以重用嗎? 無法實現的期望乍一看,模板文字似乎只在聲明時承諾動態替換。這就引出了一個問題:什麼是保持靜態的模板? 打破循環與流行的看法相反,模板文字可以使用函數通過運行時替換來重新煥發活力構造函...
    程式設計 發佈於2024-11-07
  • 在 Java 中使用 Fisher-Yates 演算法對陣列進行洗牌
    在 Java 中使用 Fisher-Yates 演算法對陣列進行洗牌
    介紹 在電腦科學領域,對元素數組或列表進行洗牌是一種常見的操作,可用於各種應用程序,從隨機化遊戲結果到分發牌組中的紙牌。為此目的最有效的演算法之一是 Fisher-Yates Shuffle,也稱為 Knuth Shuffle。該演算法確保數組的每個排列都有相同的可能性,這使其成為...
    程式設計 發佈於2024-11-07
  • 我作為全端開發人員的旅程:與 MERN Stack 一起成長的一年
    我作為全端開發人員的旅程:與 MERN Stack 一起成長的一年
    你好!我是 Shivaji Zirpe,一位充滿熱情的全端開發人員,專門研究 MERN 堆疊。在過去的一年裡,我深入研究了 Web 開發領域,廣泛使用了 React、Node.js、MongoDB 等。在這篇文章中,我想分享我的旅程、經歷以及我作為開發人員的成長過程。 ?我的經歷一...
    程式設計 發佈於2024-11-07
  • 什麼是 FHIR?
    什麼是 FHIR?
    介紹 與 fhir 相關的儲存庫清單 - Awesome-fhir 快速醫療保健互通性資源 FHIR 伺服器是一款強大的工具,徹底改變了醫療保健產業。 它充當存取和交換關鍵醫療資料的網關,實現不同系統和組織之間的無縫互通性。 什麼是 FHIR 伺服器? FHIR...
    程式設計 發佈於2024-11-07
  • 為什麼常數引用可以延長 C++ 中臨時變數的生命週期?
    為什麼常數引用可以延長 C++ 中臨時變數的生命週期?
    透過常數引用擴展右值生命週期在C 中,常量引用不僅充當不可變別名,還可以延長臨時變量的生命週期。為什麼 C 委員會決定要實現此行為? 此功能的一個基本原理是隱藏類別和函數的實作細節。考慮一個可以傳回行向量或列向量的矩陣類別。為了最佳化效能,類別可以選擇根據其行優先或列優先組織傳回內部值的參考。透過要...
    程式設計 發佈於2024-11-07
  • 如何在 Go 中將切片作為可變參數傳遞?
    如何在 Go 中將切片作為可變參數傳遞?
    將解壓縮的切片作為可變參數傳遞在 Go 中,可變參數函數接受不定數量的特定類型的參數。將切片的切片傳遞給此類函數時,了解所涉及的類型轉換和解包機制至關重要。 如果切片包含與可變參數參數類型相同的元素,則可以在不使用切片的情況下傳遞切片拆包。然而,如果切片中包含多種類型的混合或切片中包含切片,情況會變...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3