मैं कच्चे नेक्सस 3 भंडार में स्थिर एचटीएमएल + मित्र सामग्री अपलोड करने का प्रयास कर रहा हूं। जहां तक ​​दस्तावेज़ीकरण जाता है, अपलोड करने का एकमात्र तरीका है फ़ाइलें HTTP PUT का उपयोग कर रही हैं। यकीन है कि पर्याप्त,

curl -v --user 'user:pw' --upload-file my_file.html  \
    http://my.nexus/repository/my-raw-repo/my_file.html

उम्मीद के मुताबिक काम करता है और फ़ाइल को http://my.nexus/repository/my-raw-repo/index.html पर एक्सेस किया जा सकता है

हालांकि, इस परिनियोजन को मेरी रेक प्रक्रिया में जोड़ना परेशानी भरा साबित हुआ है। यहां कुछ चीजें हैं जिन्हें मैंने आजमाया है।

  1. net/http के साथ:

    require 'net/http'
    uri = URI("http://my.nexus/repository/my-raw-repo")
    file = "index.html"
    Net::HTTP.start(uri.host, uri.port) do |http|
        request = Net::HTTP::Put.new "#{repo_url}/#{file}"
        request.basic_auth(user, pw)
    
        <snip>
    
        response = http.request request
        raise "Upload failed: #{response.code} #{response.message}\n#{response.body}" \
           unless response.is_a?(Net::HTTPSuccess)
    end
    

    मैंने <snip> के लिए कई रूपों की कोशिश की।

    1. कंटेंट को स्ट्रिंग के रूप में फ़ाइल करने के लिए बॉडी सेट करें:

      request.body = File.read("#{file}")`    

      अनुरोध बिना किसी त्रुटि के पूरा होता है लेकिन Nexus फ़ाइल का आकार 0 बाइट्स दिखाता है।

    2. सामग्री को स्ट्रीम के रूप में फ़ाइल करने के लिए फ़ॉर्म डेटा भेजें:

      request.set_form([['upload', File.open("#{file}")]], 'multipart/form-data')    

      यह एक तरह का स्पष्ट है: मल्टी-पार्ट गटर जोड़ा जाता है जिसे Nexus नहीं हटाता है:

      यहां छवि विवरण दर्ज करें

  2. rest-client के साथ:

    require 'rest-client'
    file = "index.html"
    begin
        RestClient::Request.execute(
            method: :put,
            url: "http://my.nexus/repository/my-raw-repo/#{file}",
            <snip>
            user: user,
            password: pw
        )
    rescue RestClient::ExceptionWithResponse => e
        raise "Upload failed: #{e.response}"
    end
    

    और <snip> के लिए (स्पष्ट दस्तावेज़ से कम का अनुमान लगाना):

    1. body: File.read("#{file}")
      --> 0 बाइट्स।
    2. payload: File.read("#{file}")
      --> 0 बाइट्स।
    3. payload: { file: File.new("#{file}") }
      --> कई हिस्सों में गटर बना रहता है।
    4. payload: { multipart: false, file: File.new("#{file}") }
      --> कई हिस्सों में गटर बना रहता है।

    मुझे लगता है कि मैंने कई संयोजनों की कोशिश की जो मुझे याद नहीं हैं, इसी तरह के परिणामों के साथ।

ध्यान दें: मैंने एसएसएल से संबंधित भागों को स्व-हस्ताक्षरित प्रमाणपत्र के साथ छोड़ दिया है क्योंकि यह असंबंधित होना चाहिए।

मैं पुस्तकालय (या किसी अन्य) को डेटा के साथ पुट करने के लिए कैसे कह सकता हूं लेकिन बहु-भाग के बिना? या अगर यह मुद्दा नहीं है, तो मैं क्या गलत कर रहा हूँ?

मैं एक अखिल-रूबी समाधान का उपयोग करना चाहता हूं (यानी सिस्टम curl को प्रतिनिधि नहीं) ताकि निर्माण पोर्टेबल (यथासंभव) हो सके।

0
Raphael 13 मई 2019, 15:41

1 उत्तर

सबसे बढ़िया उत्तर

net/http के साथ, अनुरोध निकाय को फ़ाइल सामग्री पर स्ट्रीम के रूप में सेट करें:

request.body_stream = File.open("#{file}")
request.content_length = File.size("#{file}")
request.content_type = "text/plain" # ?!

अकेले फ़ाइल से उचित MIME प्रकार का निर्धारण करना अपने आप में एक साहसिक कार्य है।

0
Raphael 13 मई 2019, 12:41