दिलचस्प पोस्ट
एएसपी.नेट एमवीसी कैसे डेटा से नियंत्रक को पास करने के लिए प्रीफलाइट ऑप्शन एक प्रमाणित CORS अनुरोध का अनुरोध करते हैं, लेकिन क्रोम में फ़ायरफ़ॉक्स नहीं है? कितने सॉकेट कनेक्शन संभव हैं? कैसे अल्फा मिश्रण RGBA अहस्ताक्षरित बाइट रंग तेजी से? विंडोज़ पर गिट: आप एक मेरेटोल कैसे स्थापित करते हैं? मैं कैसे JSON सांकेतिक शब्दों में बदलना कर सकते हैं VB.NET में एक सरणी? क्या पीएनजी में एक्सपी डाटा जैसे JPG होते हैं? एनआरआई फ्रेमवर्क 6.0 के तहत ओआरएम इकाइयां बनाम डोमेन इकाईयां condition variable – pthread_cond_wait () को कॉल करने से पहले pthread_cond_signal () को कॉल करना एक तार्किक त्रुटि है? सी में संदर्भ से पासिंग सादी अंग्रेजी में योकोनें का प्रत्यय पेड़ एल्गोरिदम क्या उपयोग करें: var या ऑब्जेक्ट नाम का प्रकार? विंडोज में सी + + उच्च परिशुद्धता समय माप सीएसएस का उपयोग करके प्रिंट करने के लिए पृष्ठभूमि छवि कैसे प्राप्त करें? क्यों JSF कई बार getters कॉल

लूपबैक में मेटा डेटा वाली फ़ाइलों को कैसे स्टोर करना है?

मैं क्या करना चाहता / चाहती हूं: अंदर एक फ़ाइल इनपुट के साथ एक html फार्म है। जब कोई फ़ाइल चुनी जाती है, तो फ़ाइल इनपुट को फ़ाइल अपलोड करना चाहिए, और एक फ़ाइल आईडी प्राप्त करें, इसलिए जब फ़ॉर्म सबमिट किया जाता है, तो फ़ाइल आईडी फ़ॉर्म में पोस्ट की जाती है और डेटाबेस में लिखा गया है।

छोटा संस्करण: मैं अपनी फ़ाइलों के साथ मेटा डेटा (उदाहरण के लिए आईडी) को संग्रहीत करना चाहता हूं।

सरल लगता है, फिर भी मैं लूपबैक में ऐसा करने के लिए संघर्ष करता हूं।

इस विषय के बारे में कुछ बातचीत ( 1 , 2 ) रही है, और न तो समाधान के लिए आगे बढ़ना प्रतीत होता है, इसलिए मैंने सोचा कि यह एक बार और सभी के लिए एक अच्छा स्थान हो सकता है।

सरल समाधान मॉडल संबंधों का उपयोग करना होगा, लेकिन लूपबैक फ़ाइल संग्रहण सेवा से संबंधों का समर्थन नहीं करता है। टक्कर। इसलिए हमें उदाहरण के लिए File नामित एक प्रचलित मॉडेल के साथ जाना पड़ता है, और डिफ़ॉल्ट रूप से ओवरराइड बनाएं, हटाएं ताकि यह फ़ाइल स्टोर मॉडल से सहेजा और हट जाए – मेरे पास Storage नाम है।

मेरी स्थापना अब तक:

  • मेरे पास एक मॉडल / एपीआई / स्टोरेज है जो एक लूपबैक स्टोरेज सेवा से जुड़ा हुआ है और फाइल को स्थानीय फाइल सिस्टम में सफलतापूर्वक सहेज रहा है।
  • मेरे पास मोंगो से जुड़ी पर्सस्टैटमॉडल फाइल मेटा डेटा के साथ है: name , size , url और objectId
  • मेरे पास एक रिमोट हुक है जो पहले सेट किया गया है ताकि फ़ाइल को पहले सहेजा जा सके और फिर यह url को File.create() में इंजेक्ट किया जा सकता है।

मैं वहां हूं, और इस लूपबैक पृष्ठ के अनुसार, मेरे पास सीटीएक्स है जिसमें फ़ाइल को अंदर होना चाहिए:

 File.beforeRemote('create', function(ctx, affectedModelInstance, next) {})` 

ctx क्या है?

ctx.req : एक्सप्रेस अनुरोध ऑब्जेक्ट
ctx.result : एक्सप्रेस प्रतिक्रिया ऑब्जेक्ट

ठीक है, तो अब मैं एक्सप्रेस पेज पर हूँ, बहुत खो दिया है, और यह एक 'शरीर-पार्सिंग मिडलवेयर' के बारे में कुछ है जो मुझे नहीं पता कि यह क्या हो सकता है।

मुझे लगता है कि मैं समाधान के करीब हूं, किसी भी मदद की सराहना होगी । क्या यह दृष्टिकोण सही है?

वेब के समाधान से एकत्रित समाधान "लूपबैक में मेटा डेटा वाली फ़ाइलों को कैसे स्टोर करना है?"

लूपबैक में फ़ाइलों के साथ मेटा डेटा को संग्रहीत करने के लिए यहां का पूरा समाधान है

आपको एक कंटेनर मॉडल की आवश्यकता है

common/models/container.json

 { "name": "container", "base": "Model", "idInjection": true, "options": { "validateUpsert": true }, "properties": {}, "validations": [], "relations": {}, "acls": [], "methods": [] } 

server/datasources.json में अपने कंटेनर के लिए डेटा स्रोत बनाएं। उदाहरण के लिए:

 ... "storage": { "name": "storage", "connector": "loopback-component-storage", "provider": "filesystem", "root": "/var/www/storage", "maxFileSize": "52428800" } ... 

आपके पास इस मॉडल के डेटा स्रोत को server/model-config.json में loopback-component-storage करना होगा:

 ... "container": { "dataSource": "storage", "public": true } ... 

मेटा डेटा को स्टोर करने और कंटेनर कॉलों को संभालने के लिए आपको एक फ़ाइल मॉडल की आवश्यकता होगी:

common/models/file.json

 { "name": "file", "base": "PersistedModel", "idInjection": true, "options": { "validateUpsert": true }, "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "url": { "type": "string", "required": true } }, "validations": [], "relations": {}, "acls": [], "methods": [] } 

और अब container साथ file कनेक्ट करें:

common/models/file.js

 var CONTAINERS_URL = '/api/containers/'; module.exports = function(File) { File.upload = function (ctx,options,cb) { if(!options) options = {}; ctx.req.params.container = 'common'; File.app.models.container.upload(ctx.req,ctx.result,options,function (err,fileObj) { if(err) { cb(err); } else { var fileInfo = fileObj.files.file[0]; File.create({ name: fileInfo.name, type: fileInfo.type, container: fileInfo.container, url: CONTAINERS_URL+fileInfo.container+'/download/'+fileInfo.name },function (err,obj) { if (err !== null) { cb(err); } else { cb(null, obj); } }); } }); }; File.remoteMethod( 'upload', { description: 'Uploads a file', accepts: [ { arg: 'ctx', type: 'object', http: { source:'context' } }, { arg: 'options', type: 'object', http:{ source: 'query'} } ], returns: { arg: 'fileObject', type: 'object', root: true }, http: {verb: 'post'} } ); }; 

किया हुआ! अब आप file फॉर्म फ़ील्ड में file बाइनरी डेटा के साथ पोस्ट /api/file/upload कर सकते हैं। बदले में आपको वापस आईडी, नाम, प्रकार और यूआरएल मिलेगी।

मुझे भी यही समस्या थी। मैंने मेटा डेटा और मेरे अपने अपलोड विधियों को स्टोर करने के लिए अपने स्वयं के मॉडल बनाने के द्वारा इसे हल किया।

  1. मैंने एक मॉडल File बनाई जो नाम, प्रकार, यूआरएल, यूजरआईडी जैसी जानकारी संग्रहीत करेगी (तुम्हारी तरह)

  2. मैंने अपनी अपलोड रिमोट पद्धति बनाई है क्योंकि मैं इसे हुकों के साथ करने में असमर्थ था कंटेनर मॉडल मॉडल है जो लूपबैक-घटक-स्टोरेज द्वारा बनाया गया है।

  3. var fileInfo = fileObj.files.myFile[0]; यहां फ़ाइल अपलोड करने के लिए myFile फ़ील्डनाम है, इसलिए आपको इसे तदनुसार बदलना होगा। यदि आप कोई फ़ील्ड निर्दिष्ट नहीं करते हैं, तो यह fileObj.file.null[0] रूप में आ जाएगा। इस कोड में उचित त्रुटि जांच की कमी है, इसे उत्पादन में तैनात करने से पहले करें

      File.uploadFile = function (ctx,options,cb) { File.app.models.container.upload(ctx.req,ctx.result,options,function (err,fileObj) { if(err) cb(err); else{ // Here myFile is the field name associated with upload. You should change it to something else if you var fileInfo = fileObj.files.myFile[0]; File.create({ name: fileInfo.name, type: fileInfo.type, container: fileInfo.container, userId: ctx.req.accessToken.userId, url: CONTAINERS_URL+fileInfo.container+'/download/'+fileInfo.name // This is a hack for creating links },function (err,obj) { if(err){ console.log('Error in uploading' + err); cb(err); } else{ cb(null,obj); } }); } }); }; File.remoteMethod( 'uploadFile', { description: 'Uploads a file', accepts: [ { arg: 'ctx', type: 'object', http: { source:'context' } }, { arg: 'options', type 'object', http:{ source: 'query'} } ], returns: { arg: 'fileObject', type: 'object', root: true }, http: {verb: 'post'} } ); 

उन लोगों के लिए जो "फ़ाइल अपलोड करने से पहले फ़ाइल स्वरूप की जांच कैसे करें" प्रश्न का उत्तर ढूंढ रहे हैं।

इस मामले में वास्तविक हम वैकल्पिक पैराग्राफ की अनुमति कर सकते हैंसेंटेंट टाइप

डायरेक्टरी बूट में उदाहरण कोड का उपयोग करें:

 module.exports = function(server) { server.dataSources.filestorage.connector.allowedContentTypes = ["image/jpg", "image/jpeg", "image/png"]; } 

मुझे उम्मीद है कि यह किसी की मदद करेगा

बस डेटा को "params" ऑब्जेक्ट के रूप में पास करें और सर्वर पर आप इसे ctx.req.query रूप में प्राप्त कर सकते हैं

उदाहरण के लिए

क्लाइंट साइड पर

 Upload.upload( { url: '/api/containers/container_name/upload', file: file, //Additional data with file params:{ orderId: 1, customerId: 1, otherImageInfo:[] } }); 

सर्वर साइड पर

समझे कि आपका भंडारण मॉडल नाम container

 Container.beforeRemote('upload', function(ctx, modelInstance, next) { //OUPTUTS: {orderId:1, customerId:1, otherImageInfo:[]} console.log(ctx.req.query); next(); }) 

आपके परिदृश्य पर निर्भर करते हुए, यह हस्ताक्षर का उपयोग करने या इसी तरह की अमेज़ॅन एस 3, ट्रांसलोडआईट (इमेज प्रोसेसिंग के लिए) या इसी तरह की सेवाओं को सीधे अपलोड करने के लिए उपयुक्त हो सकता है।

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

आपका वर्कफ़्लो कुछ ऐसा दिखाई दे सकता है:

  1. डेटाबेस रिकॉर्ड बनाएँ
  2. रिकॉर्ड आईडी और फ़ाइल अपलोड हस्ताक्षर डेटा लौटाएं (एस 3 बाल्टी या ट्रांसलोडिट एंडपॉइंट, प्लस किसी भी एयूटी टोकन शामिल है)
  3. समापन बिंदु पर क्लाइंट अपलोड

उन मामलों के लिए जहां बैनर या अवतार अपलोड जैसी चीजें हैं, चरण 1 पहले से मौजूद है, इसलिए हम उस कदम को छोड़ देते हैं।

इसके अतिरिक्त आप अपने एस 3 बाल्टी से एसएनएस या एसक्यूएस सूचनाओं को जोड़ सकते हैं ताकि आपके डेटाबेस में पुष्टि हो सके कि संबंधित ऑब्जेक्ट में अब फ़ाइल संलग्न है – प्रभावी रूप से चरण 4।

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

उदाहरण संदर्भ:

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html

https://transloadit.com/docs/#authentication

लूपबैक 3 और पोस्टमैन के साथ समस्या होने वाले किसी और के लिए, पोस्ट पर, कनेक्शन लटका हुआ है (या रिटर्न ERR_EMPTY_RESPONSE) (इस पर कुछ टिप्पणियों में देखा गया है) … इस परिदृश्य में समस्या यह है कि पोस्टमैन सामग्री-प्रकार "एप्लिकेशन / एक्स-www फार्म-urlencoded "!

कृपया उस शीर्षलेख को निकालें और "स्वीकार करें" = "मल्टीपार्ट / फॉर्म-डेटा" जोड़ें। मैंने इस व्यवहार के लिए पहले से ही लूपबैक पर एक बग दर्ज किया है

AngularJS SDK उपयोगकर्ताओं के लिए … यदि आप कंटेनर.अपलोड () जैसे उत्पन्न विधियों का उपयोग करना चाहते हैं, तो आप सामग्री-प्रकार शीर्षलेखों को undefined करने के लिए lb-services.js में विधि को कॉन्फ़िगर करने के लिए एक पंक्ति जोड़ना चाह सकते हैं। यह ग्राहक को कंटेंट-टाइप हैडर सेट करने और स्वचालित रूप से सीमा मान जोड़ने की अनुमति देगा। ऐसा कुछ देखना होगा:

  "upload": { url: urlBase + "/containers/:container/upload", method: "POST", headers: {"Content-Type": undefined} }