วิธีที่สะดวกในการแยกวิเคราะห์พารามิเตอร์ multipart/form-data ขาเข้าใน Servlet [ซ้ำกัน]

มีวิธีที่สะดวกในการอ่านและแยกวิเคราะห์ข้อมูลจากคำขอที่เข้ามาหรือไม่

เช่นลูกค้าเริ่มต้นคำขอโพสต์

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null;
try {
    OutputStream output = connection.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
    // Send normal param.
    writer.println("--" + boundary);
    writer.println("Content-Disposition: form-data; name=\"param\"");
    writer.println("Content-Type: text/plain; charset=" + charset);
    writer.println();
    writer.println(param);

ฉันไม่สามารถรับพารามิเตอร์โดยใช้ request.getParameter("paramName") ได้ รหัสต่อไปนี้

BufferedReader reader = new BufferedReader(new InputStreamReader(
    request.getInputStream()));
  StringBuilder sb = new StringBuilder();
  for (String line; (line = reader.readLine()) != null;) {
   System.out.println(line);

  }

แต่แสดงเนื้อหาให้ฉัน

-----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------29772313742745

วิธีที่ดีที่สุดในการแยกวิเคราะห์คำขอที่เข้ามาคืออะไร ฉันไม่ต้องการเขียน parser ของตัวเอง อาจมีวิธีแก้ไขที่พร้อมอยู่


person atuser    schedule 26.07.2010    source แหล่งที่มา


คำตอบ (3)


multipart/form-data คำขอที่เข้ารหัสไม่ได้รับการสนับสนุนโดย Servlet API ก่อนเวอร์ชัน 3.0 โดยค่าเริ่มต้น Servlet API แยกวิเคราะห์พารามิเตอร์ตามค่าเริ่มต้นโดยใช้การเข้ารหัส application/x-www-form-urlencoded เมื่อใช้การเข้ารหัสอื่น การเรียก request.getParameter() จะส่งคืน null ทั้งหมด เมื่อคุณใช้ Servlet 3.0 อยู่แล้ว (Glassfish 3, Tomcat 7 ฯลฯ) จากนั้นคุณสามารถใช้ HttpServletRequest#getParts() แทน โปรดดู บล็อกนี้ เพื่อดูตัวอย่างเพิ่มเติม

ก่อน Servlet 3.0 มาตรฐาน โดยพฤตินัย เพื่อแยกวิเคราะห์คำขอ multipart/form-data จะใช้ การอัปโหลดไฟล์ Apache Commons เพียงอ่านส่วน คู่มือผู้ใช้ และ คำถามที่พบบ่อย อย่างถี่ถ้วน เพื่อเรียนรู้วิธีใช้งาน ฉันได้โพสต์คำตอบพร้อมตัวอย่างโค้ดก่อนหน้าที่นี่ (มัน ยังมีตัวอย่างการกำหนดเป้าหมาย Servlet 3.0)

person BalusC    schedule 26.07.2010
comment
ระวัง. เอกสารบางส่วนบนไซต์ apache ไม่ถูกต้อง ตัวอย่างเช่น พวกเขาบอกว่าคุณสามารถเรียก setRepository() บนออบเจ็กต์ FileItemFactory ซึ่งเป็นเท็จ เนื่องจากออบเจ็กต์ใดๆ ที่ใช้ FileItemFactory มีเพียงวิธีเดียวเท่านั้น: createItem() ดังนั้นอย่าลืมอ่าน javadocs ด้วย - person Cheruvim; 23.01.2014
comment
getParts() ส่งคืนรายการเป็นศูนย์เสมอ เหตุใดจึงยากที่จะดึงแบบฟอร์มหลายส่วนใน Java และ Servlet 3.0 ไม่อยากเชื่อเลย! - person basZero; 23.09.2016
comment
@basZero: คำตอบสำหรับคำถามที่ซ้ำกันอธิบายไว้แล้วว่าจะว่างเปล่าเมื่อใด - person BalusC; 23.09.2016
comment
@BalusC คุณมีลิงค์ไหม? มีข้อมูลค่อนข้างมากที่นี่ในหน้านี้ - person basZero; 23.09.2016

โซลูชั่น:

โซลูชัน ก:

  1. ดาวน์โหลด http://www.servlets.com/cos/index.html
  2. เรียกใช้ getParameters() บน com.oreilly.servlet.MultipartRequest

โซลูชัน B:

  1. ดาวน์โหลด http://jakarta.Apache.org/commons/fileupload/
  2. เรียกใช้ readHeaders() ใน org.apache.commons.fileupload.MultipartStream

โซลูชัน C:

  1. ดาวน์โหลด http://users.boone.net/wbrameld/multipartformdata/
  2. เรียกใช้ getParameter บน com.bigfoot.bugar.servlet.http.MultipartFormData

โซลูชัน ง:

ใช้สตรัท. Struts 1.1 จะจัดการเรื่องนี้โดยอัตโนมัติ

อ้างอิง: http://www.jguru.com/faq/view.jsp?EID=1045507

person renura    schedule 20.03.2012
comment
โปรดเสนอวิธีแก้ปัญหาบางอย่างเนื่องจากลิงก์นี้อาจใช้ไม่ได้เมื่อใดก็ได้ในอนาคต สิ่งนี้จะดึงดูดคะแนนติดลบ - person Jafar Ali; 02.03.2014

ไม่เสมอไปที่จะมีเซิร์ฟเล็ตก่อนการอัปโหลด (เช่น ฉันสามารถใช้ตัวกรองได้) หรืออาจเป็นได้ว่าคอนโทรลเลอร์ตัวเดียวกัน (อีกครั้งเป็นตัวกรองหรือเป็น serverlt ) สามารถให้บริการได้หลายอย่าง ดังนั้นฉันคิดว่าต้องใช้การกำหนดค่าเซิร์ฟเล็ตนั้นเพื่อใช้เมธอด getPart (สำหรับ Servlet API >= 3.0 เท่านั้น) ฉันไม่รู้ ฉันไม่ชอบ.

โดยทั่วไป ฉันชอบโซลูชันอิสระ สามารถอยู่คนเดียวได้ และในกรณีนี้ http://commons.apache.org/proper/commons-fileupload/ เป็นหนึ่งในนั้น

List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
    for (FileItem item : multiparts) {
        if (!item.isFormField()) {
            //your operations on file
        } else {
            String name = item.getFieldName();
            String value = item.getString();
            //you operations on paramters
        }
}
person Luca Rasconi    schedule 09.06.2015
comment
ใช้งานได้เฉพาะเมื่อคุณมีวัตถุคำขอเท่านั้น แต่ในกรณีของวัตถุสตรีมหรือข้อมูลวัตถุอื่น ๆ ล่ะ? - person Ak S; 23.11.2018
comment
ข้อมูลสตรีมหรือออบเจ็กต์อื่นจะแทนที่คำขอ ดังนั้นฉันจะแยกวิเคราะห์/อ่านสตรีมหรืออะไรก็ตามเพื่อให้ได้ข้อมูลแบบฟอร์มที่มีหลายส่วน คุณมีตัวอย่างที่แท้จริงบ้างไหม? - person Luca Rasconi; 23.11.2018