json एक फ़ाइल और एसोसिएटेड डेटा को एक विश्वसनीय वेब सेवा में अधिमानतः जेएसओएन के रूप में पोस्ट करना




rest grails (7)

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

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

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

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

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

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

"उपयोगकर्ता" फ़ील्ड के प्रवेश से संबंधित मान के साथ।

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

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

https://code.i-harness.com

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

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

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


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

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
    }

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

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

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


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

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

आप अधिक गहराई से विवरण के लिए आरएफसी 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--

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

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

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

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

यदि आप एक आराम सर्वर विकसित कर रहे हैं तो आप यह कर सकते हैं

  1. क्या क्लाइंट ने HTTP पर फ़ाइल का पर्दाफाश किया है
  2. ग्राहक तब आपके {"file_url":"http://cockwombles.com/blah.jpg"} डेटा के साथ यूआरएल भेज सकता है जैसे छवि फ़ाइल {"file_url":"http://cockwombles.com/blah.jpg"}
  3. सर्वर तब फ़ाइल डाउनलोड कर सकता है।

@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
}




file-upload