JSON के रूप में अधिमानतः एक वेबसर्वर के लिए एक फ़ाइल और एसोसिएटेड डेटा पोस्ट करना


757

यह शायद एक बेवकूफी भरा सवाल है, लेकिन मैं उन रातों में से एक हूं। एक एप्लिकेशन में मैं रैस्टफुल एपीआई विकसित कर रहा हूं और हम चाहते हैं कि क्लाइंट को JSON के रूप में डेटा भेजा जाए। इस एप्लिकेशन के भाग के लिए क्लाइंट को एक फ़ाइल (आमतौर पर एक छवि) और साथ ही छवि के बारे में जानकारी अपलोड करने की आवश्यकता होती है।

मैं एक कठिन समय को ट्रैक कर रहा हूं कि यह एक ही अनुरोध में कैसे होता है। क्या JSON स्ट्रिंग में फ़ाइल डेटा को Base64 करना संभव है? क्या मुझे सर्वर पर 2 पोस्ट करने की आवश्यकता है? क्या मुझे इसके लिए JSON का उपयोग नहीं करना चाहिए?

एक साइड नोट के रूप में, हम बैकएंड पर ग्रेल्स का उपयोग कर रहे हैं और इन सेवाओं को देशी मोबाइल क्लाइंट (iPhone, Android, आदि) द्वारा एक्सेस किया जाता है, अगर उनमें से कोई भी फर्क पड़ता है।


1
तो, ऐसा करने का सबसे अच्छा तरीका क्या है?
जेम्स ११

3
JSON के बजाय URL क्वेरी स्ट्रिंग में मेटाडेटा भेजें।
jrc

जवाबों:


632

मैंने यहाँ एक समान प्रश्न पूछा:

मैं REST वेब सेवा का उपयोग करके मेटाडेटा के साथ फ़ाइल कैसे अपलोड करूं?

आपके पास मूल रूप से तीन विकल्प हैं:

  1. Base64 फ़ाइल को लगभग 33% तक डेटा आकार बढ़ाने की कीमत पर, और एन्कोडिंग / डिकोडिंग के लिए सर्वर और क्लाइंट दोनों में प्रोसेसिंग ओवरहेड जोड़ देता है।
  2. फ़ाइल को पहले किसी multipart/form-dataPOST में भेजें , और क्लाइंट को एक आईडी लौटाएँ। क्लाइंट तब मेटाडेटा को आईडी के साथ भेजता है, और सर्वर फ़ाइल और मेटाडेटा को फिर से जोड़ देता है।
  3. पहले मेटाडेटा भेजें, और क्लाइंट को एक आईडी लौटाएं। क्लाइंट तब फ़ाइल को आईडी के साथ भेजता है, और सर्वर फ़ाइल और मेटाडेटा को फिर से जोड़ देता है।

29
यदि मैंने विकल्प 1 चुना है, तो क्या मैं JSON स्ट्रिंग के अंदर बेस 64 सामग्री को शामिल कर सकता हूँ? {फ़ाइल: '234JKFDS # $ @ # $ MFDDMS ....', नाम: 'somename' ...} या इसमें कुछ और है?
ग्रीग

15
ग्रेग, जैसा कि आपने कहा है, आप इसे सिर्फ एक संपत्ति के रूप में शामिल करेंगे, और मूल्य बेस 64-एन्कोडेड स्ट्रिंग होगा। यह संभवतः साथ जाने के लिए सबसे आसान तरीका है, लेकिन फ़ाइल आकार के आधार पर व्यावहारिक नहीं हो सकता है। उदाहरण के लिए, हमारे आवेदन के लिए, हमें उन iPhone छवियों को भेजने की आवश्यकता है जो प्रत्येक 2-3 एमबी हैं। 33% की वृद्धि स्वीकार्य नहीं है। यदि आप केवल 20KB छोटे चित्र भेज रहे हैं, तो वह ओवरहेड अधिक स्वीकार्य हो सकता है।
डैनियल टी।

19
मुझे यह भी उल्लेख करना चाहिए कि बेस 64 एन्कोडिंग / डिकोडिंग में कुछ प्रसंस्करण समय भी लगेगा। यह करना सबसे आसान काम हो सकता है, लेकिन यह निश्चित रूप से सबसे अच्छा नहीं है।
डैनियल टी।

8
base64 के साथ json? हम्म .. मैं मल्टिपार्ट / फॉर्म को छड़ी करने के बारे में सोच रहा हूं
सर्वव्यापी

12
एक अनुरोध में मल्टीपार्ट / फॉर्म-डेटा का उपयोग करने से इनकार क्यों किया जाता है?
1

107

आप मल्टीपार्ट / फॉर्म-डेटा सामग्री प्रकार का उपयोग करके एक अनुरोध पर फ़ाइल और डेटा भेज सकते हैं :

कई अनुप्रयोगों में, उपयोगकर्ता के लिए एक फ़ॉर्म के साथ प्रस्तुत किया जाना संभव है। उपयोगकर्ता उस प्रपत्र को भरेगा, जिसमें टाइप की गई जानकारी, उपयोगकर्ता इनपुट द्वारा उत्पन्न, या उपयोगकर्ता द्वारा चुनी गई फ़ाइलों से शामिल है। जब फॉर्म भर दिया जाता है, तो फॉर्म का डेटा उपयोगकर्ता से प्राप्त करने वाले एप्लिकेशन को भेज दिया जाता है।

MultiPart / Form-Data की परिभाषा उन अनुप्रयोगों में से एक से ली गई है ...

से http://www.faqs.org/rfcs/rfc2388.html :

"मल्टीपार्ट / फॉर्म-डेटा" में भागों की एक श्रृंखला होती है। प्रत्येक भाग में एक कंटेंट-डिस्पेंस हेडर [RFC 2183] होने की उम्मीद की जाती है, जहाँ पर डिस्पेंस टाइप "फॉर्म-डेटा" होता है, और जहाँ डिस्पोज़ल में "नाम" का अतिरिक्त (अतिरिक्त) पैरामीटर होता है, जहाँ उस पैरामीटर का मान मूल होता है प्रपत्र में फ़ील्ड नाम। उदाहरण के लिए, किसी भाग में हेडर हो सकता है:

सामग्री-विवाद: फ़ॉर्म-डेटा; नाम = "उपयोगकर्ता"

"उपयोगकर्ता" फ़ील्ड के प्रवेश के अनुरूप मूल्य के साथ।

आप सीमाओं के बीच प्रत्येक अनुभाग में फ़ाइल जानकारी या फ़ील्ड जानकारी शामिल कर सकते हैं। मैंने सफलतापूर्वक एक RESTful सेवा को लागू किया है, जिसके लिए उपयोगकर्ता को डेटा और फ़ॉर्म दोनों प्रस्तुत करने की आवश्यकता होती है, और मल्टीपार्ट / फ़ॉर्म-डेटा पूरी तरह से काम करता है। जावा / स्प्रिंग का उपयोग करके सेवा का निर्माण किया गया था, और ग्राहक C # का उपयोग कर रहा था, इसलिए दुर्भाग्य से मेरे पास कोई उदाहरण नहीं है कि आप इस सेवा को कैसे सेट करें। आपको इस मामले में JSON का उपयोग करने की आवश्यकता नहीं है क्योंकि प्रत्येक "फॉर्म-डेटा" अनुभाग आपको पैरामीटर का नाम और उसके मूल्य को निर्दिष्ट करने के लिए एक जगह प्रदान करता है।

मल्टीपार्ट / फॉर्म-डेटा का उपयोग करने के बारे में अच्छी बात यह है कि आप HTTP- परिभाषित हेडर का उपयोग कर रहे हैं, इसलिए आप अपनी सेवा बनाने के लिए मौजूदा HTTP टूल का उपयोग करने के REST दर्शन के साथ चिपके हुए हैं।


1
धन्यवाद, लेकिन मेरा प्रश्न अनुरोध के लिए JSON का उपयोग करना चाहता था और यदि यह संभव था, पर केंद्रित था। मुझे पहले से ही पता है कि मैं आपको सुझाव देने का तरीका भेज सकता हूं।
ग्रीग

15
हाँ, यह अनिवार्य रूप से "क्या मुझे इसके लिए JSON का उपयोग नहीं करना चाहिए?" क्या कोई विशिष्ट कारण है कि आप क्लाइंट को JSON का उपयोग करना चाहते हैं?
मैकस्ट्रेच

3
सबसे अधिक संभावना एक व्यावसायिक आवश्यकता या स्थिरता के साथ रखते हुए। बेशक, करने के लिए आदर्श बात यह है कि सामग्री-प्रकार HTTP हेडर के आधार पर दोनों (प्रपत्र डेटा और JSON प्रतिक्रिया) को स्वीकार करें।
डैनियल टी।

2
JSON का चयन करने से क्लाइंट और सर्वर साइड दोनों में बहुत अधिक सुरुचिपूर्ण कोड होता है, जो कम संभावित बग की ओर जाता है। फॉर्म डेटा तो कल है।
superarts.org

5
मैं माफी माँगता हूँ अगर मैंने कहा कि यह कुछ चोट लगी है। नेट डेवलपर की भावना। हालाँकि अंग्रेजी मेरी मूल भाषा नहीं है, यह मेरे लिए एक वैध बहाना नहीं है कि तकनीक के बारे में कुछ असभ्य कहा जाए। प्रपत्र डेटा का उपयोग करना भयानक है और यदि आप इसका उपयोग करते हैं तो आप और भी भयानक हो जाएंगे!
superarts.org

53

मुझे पता है कि यह धागा काफी पुराना है, हालांकि, मैं यहां एक विकल्प याद कर रहा हूं। यदि आपके पास मेटाडेटा (किसी भी प्रारूप में) जिसे आप अपलोड करने के लिए डेटा के साथ भेजना चाहते हैं, तो आप एक multipart/relatedअनुरोध कर सकते हैं ।

मल्टीपार्ट / संबंधित मीडिया प्रकार यौगिक वस्तुओं के लिए अभिप्रेत है जिसमें कई अंतर-संबंधित शरीर के अंग होते हैं।

अधिक गहराई से जानकारी के लिए आप RFC 2387 विनिर्देश की जांच कर सकते हैं ।

मूल रूप से इस तरह के अनुरोध के प्रत्येक भाग में अलग-अलग प्रकार की सामग्री हो सकती है और सभी हिस्से किसी न किसी तरह से संबंधित होते हैं (जैसे एक छवि और यह मेटाडेटा)। भागों की पहचान एक सीमा स्ट्रिंग द्वारा की जाती है, और अंतिम सीमा स्ट्रिंग के बाद दो हाइफ़न होते हैं।

उदाहरण:

POST /upload HTTP/1.1
Host: www.hostname.com
Content-Type: multipart/related; boundary=xyz
Content-Length: [actual-content-length]

--xyz
Content-Type: application/json; charset=UTF-8

{
    "name": "Sample image",
    "desc": "...",
    ...
}

--xyz
Content-Type: image/jpeg

[image data]
[image data]
[image data]
...
--foo_bar_baz--

मुझे आपका समाधान सबसे अच्छा लगा। दुर्भाग्य से, ब्राउज़र में उत्परिवर्तित / संबंधित अनुरोध बनाने का कोई तरीका नहीं है।
पेट्र बॉडीस

क्या आपके पास क्लाइंट (विशेषकर जेएस वाले) को इस तरह से एपीआई के साथ संवाद करने का कोई अनुभव है
pvgoddijn

दुर्भाग्य से, वर्तमान में php (7.2.1) पर इस प्रकार का डेटा के लिए कोई पाठक है और आप अपने खुद के पार्सर का निर्माण करने के लिए होता है
dewd

यह दुखद है कि सर्वर और क्लाइंट के पास इसके लिए अच्छा समर्थन नहीं है।
नादेर घनबारी

14

मुझे पता है कि यह प्रश्न पुराना है, लेकिन पिछले दिनों मैंने इसी प्रश्न को हल करने के लिए पूरी वेब खोज की थी। मेरे पास अन्य आरईएस वेबसर्विस और आईफ़ोन क्लाइंट हैं जो चित्र, शीर्षक और विवरण भेजते हैं।

मुझे नहीं पता कि मेरा दृष्टिकोण सबसे अच्छा है, लेकिन इतना आसान और सरल है।

मैं UIImagePickerController का उपयोग करके एक तस्वीर लेता हूं और चित्र के डेटा को भेजने के अनुरोध के हेडर टैग का उपयोग करके NSData को सर्वर पर भेजता हूं।

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"myServerAddress"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:UIImageJPEGRepresentation(picture, 0.5)];
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"myPhotoTitle" forHTTPHeaderField:@"Photo-Title"];
[request setValue:@"myPhotoDescription" forHTTPHeaderField:@"Photo-Description"];

NSURLResponse *response;

NSError *error;

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

सर्वर साइड पर, मुझे कोड का उपयोग करके फोटो प्राप्त होता है:

InputStream is = request.inputStream

def receivedPhotoFile = (IOUtils.toByteArray(is))

def photo = new Photo()
photo.photoFile = receivedPhotoFile //photoFile is a transient attribute
photo.title = request.getHeader("Photo-Title")
photo.description = request.getHeader("Photo-Description")
photo.imageURL = "temp"    

if (photo.save()) {    

    File saveLocation = grailsAttributes.getApplicationContext().getResource(File.separator + "images").getFile()
    saveLocation.mkdirs()

    File tempFile = File.createTempFile("photo", ".jpg", saveLocation)

    photo.imageURL = saveLocation.getName() + "/" + tempFile.getName()

    tempFile.append(photo.photoFile);

} else {

    println("Error")

}

मुझे नहीं पता कि मुझे भविष्य में समस्या है, लेकिन अब उत्पादन वातावरण में ठीक काम कर रहा है।


1
मुझे http हेडर का उपयोग करने का यह विकल्प पसंद है। यह विशेष रूप से अच्छी तरह से काम करता है जब मेटाडेटा और मानक http हेडर के बीच कुछ समरूपता होती है, लेकिन आप स्पष्ट रूप से अपना खुद का आविष्कार कर सकते हैं।
EJ कैंपबेल

14

यहाँ मेरा दृष्टिकोण एपीआई (मैं उदाहरण का उपयोग करता हूं) - जैसा कि आप देख सकते हैं, आप किसी भी file_id(एपीआई सर्वर में अपलोड की गई फ़ाइल पहचानकर्ता) का उपयोग नहीं करते हैं :

  1. photoसर्वर पर ऑब्जेक्ट बनाएं :

    POST: /projects/{project_id}/photos   
    body: { name: "some_schema.jpg", comment: "blah"}
    response: photo_id
  2. फ़ाइल अपलोड करें (यह नोट fileएकवचन रूप में है क्योंकि यह केवल एक फोटो है):

    POST: /projects/{project_id}/photos/{photo_id}/file
    body: file to upload
    response: -

और फिर उदाहरण के लिए:

  1. तस्वीरों की सूची पढ़ें

    GET: /projects/{project_id}/photos
    response: [ photo, photo, photo, ... ] (array of objects)
  2. कुछ फोटो विवरण पढ़ें

    GET: /projects/{project_id}/photos/{photo_id}
    response: { id: 666, name: 'some_schema.jpg', comment:'blah'} (photo object)
  3. पढ़ें फोटो फाइल

    GET: /projects/{project_id}/photos/{photo_id}/file
    response: file content

तो निष्कर्ष यह है कि, पहले आप POST द्वारा एक ऑब्जेक्ट (फोटो) बनाते हैं, और फिर आप फ़ाइल के साथ दूसरा अनुरोध (फिर POST) भेजते हैं।


3
ऐसा लगता है कि इसे प्राप्त करने के लिए अधिक 'RESTFUL' तरीका है।
जेम्स वेबस्टर

नए बनाए गए संसाधनों के लिए POST ऑपरेशन, ऑब्जेक्ट के सरल संस्करण विवरण में स्थान आईडी वापस करना होगा
इवान प्रोस्कुरोवोव

@ivanproskuryakov "क्यों" करना चाहिए? ऊपर दिए गए उदाहरण में (बिंदु 2 में POST) फ़ाइल आईडी बेकार है। दूसरा तर्क (बिंदु 2 में POST के लिए) मैं एकवचन प्रपत्र '/ फ़ाइल' ('/ फ़ाइलें') का उपयोग करता हूं, इसलिए आईडी की आवश्यकता नहीं है क्योंकि पथ: / परियोजनाओं / 2 / फ़ोटो / 3 / फ़ाइल पहचान फोटो फ़ाइल के लिए पूर्ण जानकारी दें।
कामिल Kiełczewski

HTTP प्रोटोकॉल विनिर्देशन से। w3.org/Protocols/rfc2616/rfc2616-sec10.html 10.2.2 201 बनाया गया "नए बनाए गए संसाधन को प्रतिक्रिया की इकाई में यूआरआई (एस) द्वारा संदर्भित किया जा सकता है, जिसके द्वारा दिए गए संसाधन के लिए सबसे विशिष्ट यूआरआई है। एक स्थान हेडर फ़ील्ड। " @ KamilKiełczewski (एक) और (दो) को एक POST ऑपरेशन में जोड़ा जा सकता है POST: / प्रोजेक्ट्स / {project_id} / फ़ोटो आपको स्थान हेडर लौटाएंगे, जिसका उपयोग GET सिंगल फोटो (संसाधन *) ऑपरेशन के लिए किया जा सकता है: सभी विवरण CGET के साथ एकल तस्वीर: तस्वीरों के सभी संग्रह प्राप्त करने के लिए
इवान Proskuryakov

1
यदि मेटाडेटा और अपलोड अलग-अलग ऑपरेशन हैं, तो एंडपॉइंट्स में ये समस्याएँ हैं: फ़ाइल अपलोड के लिए पोस्ट किए गए POST ऑपरेशन का उपयोग किया जाता है - POST नहीं है। PUT (idempotent) का उपयोग किया जाना चाहिए क्योंकि आप एक नया निर्माण किए बिना संसाधन बदल रहे हैं। REST संसाधनों नामक वस्तुओं के साथ काम करता है । POST: "../photos/" PUT: "../photos/unningphoto_id}" GET: "../photos/" GET: "../photos/unningphoto_id}" PS "। अपलोड को अलग-अलग बिंदुओं में अलग करने से अप्रतिबंधित व्यवहार हो सकता है। restapitutorial.com/lessons/idempotency.html restful-api-design.readthedocs.io/en/latest/resources.html
Ivan Proskuryakov

6

FormData ऑब्जेक्ट्स: Ajax का उपयोग करके फ़ाइलें अपलोड करें

XMLHttpRequest Level 2 नए फॉर्मडाटा इंटरफ़ेस के लिए समर्थन जोड़ता है। फ़ॉर्मडाटा ऑब्जेक्ट्स फॉर्म फ़ील्ड्स और उनके मूल्यों का प्रतिनिधित्व करने वाले कुंजी / मूल्य जोड़े के सेट को आसानी से बनाने का एक तरीका प्रदान करते हैं, जिसे तब XMLHttpRequest सेंड () विधि का उपयोग करके आसानी से भेजा जा सकता है।

function AjaxFileUpload() {
    var file = document.getElementById("files");
    //var file = fileInput;
    var fd = new FormData();
    fd.append("imageFileData", file);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", '/ws/fileUpload.do');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
             alert('success');
        }
        else if (uploadResult == 'success')
             alert('error');
    };
    xhr.send(fd);
}

https://developer.mozilla.org/en-US/docs/Web/API/FormData


6

चूंकि एकमात्र लापता उदाहरण ANDROID उदाहरण है , इसलिए मैं इसे जोड़ूंगा । यह तकनीक एक कस्टम AsyncTask का उपयोग करती है जिसे आपके गतिविधि वर्ग के अंदर घोषित किया जाना चाहिए।

private class UploadFile extends AsyncTask<Void, Integer, String> {
    @Override
    protected void onPreExecute() {
        // set a status bar or show a dialog to the user here
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        // progress[0] is the current status (e.g. 10%)
        // here you can update the user interface with the current status
    }

    @Override
    protected String doInBackground(Void... params) {
        return uploadFile();
    }

    private String uploadFile() {

        String responseString = null;
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://example.com/upload-file");

        try {
            AndroidMultiPartEntity ampEntity = new AndroidMultiPartEntity(
                new ProgressListener() {
                    @Override
                        public void transferred(long num) {
                            // this trigger the progressUpdate event
                            publishProgress((int) ((num / (float) totalSize) * 100));
                        }
            });

            File myFile = new File("/my/image/path/example.jpg");

            ampEntity.addPart("fileFieldName", new FileBody(myFile));

            totalSize = ampEntity.getContentLength();
            httpPost.setEntity(ampEntity);

            // Making server call
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            int statusCode = httpResponse.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                responseString = EntityUtils.toString(httpEntity);
            } else {
                responseString = "Error, http status: "
                        + statusCode;
            }

        } catch (Exception e) {
            responseString = e.getMessage();
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        // if you want update the user interface with upload result
        super.onPostExecute(result);
    }

}

इसलिए, जब आप अपनी फ़ाइल को केवल कॉल पर अपलोड करना चाहते हैं:

new UploadFile().execute();

हाय, AndroidMultiPartEntity क्या है कृपया समझाएं ... और अगर मैं पीडीएफ, शब्द या xls फ़ाइल अपलोड करना चाहता हूं तो मुझे क्या करना है, कृपया कुछ मार्गदर्शन दें ... मैं इसके लिए नया हूं।
अमित पंड्या

1
@amitpandya मैंने कोड को एक जेनेरिक फ़ाइल अपलोड में बदल दिया है, इसलिए इसे पढ़ने वाले किसी भी व्यक्ति के लिए अधिक स्पष्ट है
lifeisfoo

2

मैं बैकेंड सर्वर पर कुछ तार भेजना चाहता था। मैंने मल्टीपार्ट के साथ json का उपयोग नहीं किया, मैंने अनुरोध params का उपयोग किया है।

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void uploadFile(HttpServletRequest request,
        HttpServletResponse response, @RequestParam("uuid") String uuid,
        @RequestParam("type") DocType type,
        @RequestParam("file") MultipartFile uploadfile)

उर्ल जैसा लगेगा

http://localhost:8080/file/upload?uuid=46f073d0&type=PASSPORT

मैं फाइल अपलोड के साथ दो पाराम (यूआईडी और टाइप) पास कर रहा हूं। आशा है कि यह मदद करेगा जिनके पास भेजने के लिए जटिल json डेटा नहीं है।


1

आप https://square.github.io/okhttp/ लाइब्रेरी का उपयोग करके देख सकते हैं । आप अनुरोध बॉडी को मल्टीपार्ट करने के लिए सेट कर सकते हैं और फिर फाइल और जसन ऑब्जेक्ट्स को अलग से जोड़ सकते हैं:

MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("uploadFile", uploadFile.getName(), okhttp3.RequestBody.create(uploadFile, MediaType.parse("image/png")))
                .addFormDataPart("file metadata", json)
                .build();

        Request request = new Request.Builder()
                .url("https://uploadurl.com/uploadFile")
                .post(requestBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            logger.info(response.body().string());

0
@RequestMapping(value = "/uploadImageJson", method = RequestMethod.POST)
    public @ResponseBody Object jsongStrImage(@RequestParam(value="image") MultipartFile image, @RequestParam String jsonStr) {
-- use  com.fasterxml.jackson.databind.ObjectMapper convert Json String to Object
}

-5

कृपया सुनिश्चित करें कि आपके पास निम्न आयात है। अन्य मानक आयातों में सहायता करें

import org.springframework.core.io.FileSystemResource


    void uploadzipFiles(String token) {

        RestBuilder rest = new RestBuilder(connectTimeout:10000, readTimeout:20000)

        def zipFile = new File("testdata.zip")
        def Id = "001G00000"
        MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>()
        form.add("id", id)
        form.add('file',new FileSystemResource(zipFile))
        def urld ='''http://URL''';
        def resp = rest.post(urld) {
            header('X-Auth-Token', clientSecret)
            contentType "multipart/form-data"
            body(form)
        }
        println "resp::"+resp
        println "resp::"+resp.text
        println "resp::"+resp.headers
        println "resp::"+resp.body
        println "resp::"+resp.status
    }

1
यह मिलता हैjava.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String
Mariano Ruiz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.