เพียงเพราะคุณไม่ได้ห่อเนื้อหาคำขอทั้งหมดไว้ใน JSON ไม่ได้หมายความว่าไม่เหมาะที่จะใช้multipart/form-data
โพสต์ทั้ง JSON และไฟล์ในคำขอเดียว:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
ทางฝั่งเซิร์ฟเวอร์ (ใช้ Python สำหรับ pseudocode):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
หากต้องการอัปโหลดหลายไฟล์เป็นไปได้ที่จะใช้ "เขตข้อมูลฟอร์ม" แยกสำหรับแต่ละไฟล์
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... ซึ่งในกรณีนี้รหัสเซิร์ฟเวอร์จะมีrequest.args['file1'][0]
และrequest.args['file2'][0]
หรือนำมาใช้ซ้ำสำหรับหลาย ๆ คน:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... ซึ่งในกรณีนี้request.args['files']
จะเป็นรายการความยาว 2
หรือส่งหลายไฟล์ผ่านฟิลด์เดียว:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... ซึ่งในกรณีนี้request.args['files']
จะเป็นสตริงที่มีไฟล์ทั้งหมดซึ่งคุณจะต้องแยกวิเคราะห์ตัวเอง - ไม่แน่ใจว่าจะทำอย่างไร แต่ฉันแน่ใจว่ามันไม่ยากหรือดีกว่าเพียงใช้วิธีการก่อนหน้านี้
ความแตกต่างระหว่าง@
และ<
คือ@
สาเหตุที่ทำให้ไฟล์แนบในขณะอัปโหลดไฟล์ในขณะที่<
แนบเนื้อหาของไฟล์เป็นฟิลด์ข้อความ
PSเพียงเพราะฉันใช้curl
เป็นวิธีในการสร้างPOST
คำขอไม่ได้หมายความว่าคำขอ HTTP ที่เหมือนกันไม่สามารถส่งจากภาษาการเขียนโปรแกรมเช่น Python หรือใช้เครื่องมือที่มีความสามารถเพียงพอ