c# ASP.NET कोर एप्लिकेशन में एक फाइल कैसे सबमिट करें




asp.net-mvc sharepoint (3)

मेरे पास एक एएसपी.नेट अनुप्रयोग है जो फाइल अपलोड करने के लिए एक साधारण फ़ॉर्म प्रस्तुत करता है (चित्र)। ऐसा लगता है:

public IActionResult Process()
{
    return View();
}

[HttpPost]
public IActionResult Process(List<IFormFile> files)
{
    var telemetry = new TelemetryClient();
    try
    {
        var result = files.Count + " file(s) processed " + Environment.NewLine;
        foreach (var file in files)
        {
            result += file.FileName + Environment.NewLine;
            var memoryStream = new MemoryStream();
            file.CopyTo(memoryStream);
            memoryStream.Seek(0, SeekOrigin.Begin);
            var binaryReader = new BinaryReader(memoryStream);
            var bytes = binaryReader.ReadBytes((int)memoryStream.Length);

            var imageInformation = ImageService.ProcessImage(bytes);

            ImageService.SaveImage(imageInformation.Result, bytes, file.FileName.Substring(file.FileName.LastIndexOf(".", StringComparison.Ordinal) + 1));
        }

        return View((object)result);
    }
    catch (Exception ex)
    {
        telemetry.TrackException(ex);
        throw;
    }
}

आवेदन में यह फ़ॉर्म ठीक काम करता है। समस्या यह है कि मैं माइक्रोसॉफ्ट फ्लो का इस्तेमाल उन फाइलों को जमा करना चाहता हूं जो ऊपर दिए गए वेब अनुप्रयोग में एक SharePoint लाइब्रेरी में आते हैं।

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

मेरे द्वारा सेटअप किया गया प्रवाह है

  1. जब कोई फ़ाइल बनाई जाती है (SharePoint) (यह एक विशिष्ट दस्तावेज़ लायब्रेरी की तरफ इशारा करता है
  2. एचटीपीपी (एचटीटीपी), विधि: पोस्ट, उरी (मेरी ऐप पर इशारा करते हुए), बॉडी: ऊपर की ओर से SharePoint चरण से फ़ाइल सामग्री।

जैसा कि मैंने उल्लेख किया है कि यह साइट पर पोस्ट कर रहा है, लेकिन फाइल में एएसपी.नेट विधि को संभाल कर किसी तरह से गुजरना नहीं चाहिए, इसलिए यह कुछ भी संसाधित नहीं कर रहा है। मैं या तो प्रवाह या पोस्ट विधि को कैसे बदल सकता हूं, ताकि यह काम करे।

नई जानकारी के साथ नवीनीकृत मैंने इसे बहुत छोटी छवि के साथ करने की कोशिश की है, इसलिए मुझे कुछ अतिरिक्त अनुरोध जानकारी मिल सकती है। ब्राउज़र में प्रपत्र का उपयोग करके मैंने इसे करने की कोशिश की और Fiddler का उपयोग करते हुए निम्न अनुरोध रॉ परिणाम जा रहा है:

POST https://os-gbsphotoretain.azurewebsites.net/Image/Process HTTP/1.1
Host: os-gbsphotoretain.azurewebsites.net
Connection: keep-alive
Content-Length: 924
Pragma: no-cache
Cache-Control: no-cache
Origin: https://os-gbsphotoretain.azurewebsites.net
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySjQVgrsvAqJYXmST
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://os-gbsphotoretain.azurewebsites.net/Image/Process
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: _ga=GA1.3.955734319.1501514097; ai_user=UkqSf|2017-07-31T15:17:38.409Z; ARRAffinity=1628d46398b292eb2e3ba76b4b0f1eb1e30abd9bd1036d7a90b9c51f7baa2306; ai_session=/fPFh|1502738361594.15|1502738361594.15

------WebKitFormBoundarySjQVgrsvAqJYXmST
Content-Disposition: form-data; name="files"; filename="printer.jpg"
Content-Type: image/jpeg

     JFIF  ` `     C            



 $.' ",#(7),01444'9=82<.342   C         


2!!22222222222222222222222222222222222222222222222222     "                 

       } !1AQa "q2   #B  R  $3br    
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz                                                                                       

       w !1AQ aq"2 B        #3R br 
$4 % &'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz                                                                             ?  
    +X K     21 c Z  ] ӥg v  ; :          P     I f >   m;] ֬u nm   ` Q 1 P6 s 9 |b r|   G  
------WebKitFormBoundarySjQVgrsvAqJYXmST--

प्रवाह के माध्यम से एक ही छवि करना मैं प्रवाह में शरीर के रूप में निम्नलिखित मिलता है:

{
  "$content-type": "image/jpeg",
  "$content": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1C9EMuqzGK1juS+3P7rccgc4yMYxjv1q/ol0I4bfTpQVniXaoyDuQHjoTg7ccGsDU7O+0+xEdoJfMUKiKE84MB/dJ5B9mzj6VneFtO1271qx1G+hubaGBjmCSUfMSMZZQNoxzgDnPfGKqcnypEJW1R//Z"
}

तो ऐसा लगता है कि प्रवाह JSON के रूप में जमा हो रहा है। मैं एक परीक्षण के रूप में अब कुछ अतिरिक्त प्रोसेसिंग करने की कोशिश कर रहा हूं, लेकिन अगर कोई जानता है कि मैं इसे वेब एड में कैसे रख सकता हूं, तो मैं इसकी सराहना करता हूं।

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

[HttpPost]
    public IActionResult ProcessJson(string json)
    {
        var telemetry = new TelemetryClient();
        try
        {
            var result = "JSON processed " + Environment.NewLine;
            var details = (dynamic)Newtonsoft.Json.JsonConvert.DeserializeObject(json);
            var content = (string) details["$content"];
            var bytes = Convert.FromBase64String(content);

            ProcessBytes(bytes, "jpeg");
            return View("Process", result);
        }
        catch (Exception ex)
        {
            telemetry.TrackException(ex);
            throw;
        }
    }

मैंने इस हस्ताक्षर के साथ एक विधि की कोशिश की है, लेकिन कोई भाग्य नहीं है या तो यह शून्य के रूप में आता है

        [HttpPost]
        public IActionResult ProcessJson([FromBody]FlowFile file)
        {
...
        }



 public class FlowFile
    {

        [JsonProperty(PropertyName = "$content-type")]
        public string ContentType { get; set; }
        [JsonProperty(PropertyName = "$content")]
        public string Content { get; set; }
    }

मैंने कुछ मिडलवेयर जोड़ा, ताकि मैं कच्चे अनुरोध प्राप्त कर सकूं.बड़ी और अंतिम परिणाम जो उस से आता है। मुझे यकीन नहीं है कि यह क्या है

&#xD;&#xA;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#x10;JFIF&#x0;&#x1;&#x1;&#x1;&#x0;`&#x0;`&#x0;&#x0;&#xFFFD;&#xFFFD;&#x0;C&#x0;&#x8;&#x6;&#x6;&#x7;&#x6;&#x5;&#x8;&#x7;&#x7;&#x7;&#x9;&#x9;&#x8;&#xA;&#xC;&#x14;&#xD;&#xC;&#xB;&#xB;&#xC;&#x19;&#x12;&#x13;&#xF;&#x14;&#x1D;&#x1A;&#x1F;&#x1E;&#x1D;&#x1A;&#x1C;&#x1C; $.&#x27; &quot;,#&#x1C;&#x1C;(7),01444&#x1F;&#x27;9=82&lt;.342&#xFFFD;&#xFFFD;&#x0;C&#x1;&#x9;&#x9;&#x9;&#xC;&#xB;&#xC;&#x18;&#xD;&#xD;&#x18;2!&#x1C;!22222222222222222222222222222222222222222222222222&#xFFFD;&#xFFFD;&#x0;&#x11;&#x8;&#x0;&#x10;&#x0;&#x10;&#x3;&#x1;&quot;&#x0;&#x2;&#x11;&#x1;&#x3;&#x11;&#x1;&#xFFFD;&#xFFFD;&#x0;&#x1F;&#x0;&#x0;&#x1;&#x5;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x1;&#x2;&#x3;&#x4;&#x5;&#x6;&#x7;&#x8;&#x9;&#xA;&#xB;&#xFFFD;&#xFFFD;&#x0;&#xFFFD;&#x10;&#x0;&#x2;&#x1;&#x3;&#x3;&#x2;&#x4;&#x3;&#x5;&#x5;&#x4;&#x4;&#x0;&#x0;&#x1;}&#x1;&#x2;&#x3;&#x0;&#x4;&#x11;&#x5;&#x12;!1A&#x6;&#x13;Qa&#x7;&quot;q&#x14;2&#xFFFD;&#xFFFD;&#xFFFD;&#x8;#B&#xFFFD;&#xFFFD;&#x15;R&#xFFFD;&#xFFFD;$3br&#xFFFD;&#x9;&#xA;&#x16;&#x17;&#x18;&#x19;&#x1A;%&amp;&#x27;()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#x1F;&#x1;&#x0;&#x3;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x1;&#x2;&#x3;&#x4;&#x5;&#x6;&#x7;&#x8;&#x9;&#xA;&#xB;&#xFFFD;&#xFFFD;&#x0;&#xFFFD;&#x11;&#x0;&#x2;&#x1;&#x2;&#x4;&#x4;&#x3;&#x4;&#x7;&#x5;&#x4;&#x4;&#x0;&#x1;&#x2;w&#x0;&#x1;&#x2;&#x3;&#x11;&#x4;&#x5;!1&#x6;&#x12;AQ&#x7;aq&#x13;&quot;2&#xFFFD;&#x8;&#x14;B&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x9;#3R&#xFFFD;&#x15;br&#xFFFD;&#xA;&#x16;$4&#xFFFD;%&#xFFFD;&#x17;&#x18;&#x19;&#x1A;&amp;&#x27;()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#xC;&#x3;&#x1;&#x0;&#x2;&#x11;&#x3;&#x11;&#x0;?&#x0;&#xFFFD;&#xB;&#xFFFD;&#xC;&#xFFFD;&#xFFFD;&#xFFFD;&#x2B;X&#xFFFD;K&#xFFFD;&#xFFFD;&#xFFFD;&#x1C;&#xFFFD;&#xFFFD;21&#xFFFD;c&#xFFFD;Z&#xFFFD;&#xFFFD;]&#x8;&#xFFFD;&#x4E5;&#x5;g&#xFFFD;v&#xFFFD;&#xFFFD;;&#xFFFD;&#x1E;:&#x13;&#xFFFD;&#xFFFD;&#x1C;&#x1A;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x11;&#x1D;&#xFFFD;&#xFFFD;&#xFFFD;P&#xFFFD;&#xFFFD;&#x13;&#xFFFD;&#xC;&#x7;&#xFFFD;I&#xFFFD;&#x1F;f&#xFFFD;&gt;&#xFFFD;&#xFFFD;&#xFFFD;m;]&#xFFFD;&#x5AC;u&#x1B;&#xFFFD;nm&#xFFFD;&#xFFFD;&#xFFFD;`&#xFFFD;Q&#xFFFD;&#x12;1&#xFFFD;P6&#xFFFD;s&#xFFFD;9&#xFFFD;|b&#xFFFD;r|&#xFFFD;&#x10;&#xFFFD;&#xFFFD;G&#xFFFD;

List<IFormFile> पैरामीटर होने के बजाय, HttpContext.Request में Files संपत्ति का उपयोग करें


ठीक है, यह थोड़ा अस्पष्ट नहीं है कि फ़ाइल कैसे ठीक भेजी जाती है: क्या यह एक जेसन ऑब्जेक्ट है जहां फ़ाइल को पहले बेस 64 स्ट्रिंग के रूप में कनवर्ट किया गया है या क्या यह एक फ़ाइल सामग्री है? (एचटीएमएल हेडर संकेतक हैं)

यदि आपके पास json सिद्धांत है जो आप कर सकते हैं:

var parsedFileContent = Newtonsoft.Json.JsonConvert.DeserializeObject<FlowFile>(json);

के बजाय

var details = (dynamic)Newtonsoft.Json.JsonConvert.DeserializeObject(json);

और यह काम करना चाहिए, यदि और केवल तभी;), जो आपने पोस्ट किया है वह सही है

{
  "$content-type": "image/jpeg",
  "$content": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1C9EMuqzGK1juS+3P7rccgc4yMYxjv1q/ol0I4bfTpQVniXaoyDuQHjoTg7ccGsDU7O+0+xEdoJfMUKiKE84MB/dJ5B9mzj6VneFtO1271qx1G+hubaGBjmCSUfMSMZZQNoxzgDnPfGKqcnypEJW1R//Z"
}

बस यह सुनिश्चित करें कि json एकल पंक्ति की स्ट्रिंग में है (सुनिश्चित करें कि कोई छिपा हुआ वर्ण नहीं है जैसे \ n या समान)

दूसरी ओर, आपके Fidler कैद में आपके पास:

सामग्री-प्रकार: मल्टीपार्ट / फॉर्म-डेटा;

तो IFormFile के साथ जाने का सही तरीका

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


आखिरकार मुझे यह काम मिला। मुझे क्या करने की ज़रूरत थी सीधे रॉ अनुरोध स्ट्रीम को पढ़ने के लिए और वह स्ट्रीम केवल छवि है सब कुछ जो फ्लो बेस 64 एन्कोडेड JSON स्ट्रिंग में छवि को सबमिट करने के बारे में कह रहा था, सही नहीं था। मैं इसे किसी भी पैरामीटर या अनुरोध के रूप में बाँध नहीं कर सका। फ़ार्म। फाइलें, लेकिन मैं सीधे धारा को पढ़ सकता हूं और उस छवि को सीधे से बचा सकता हूं।





microsoft-flow