HTTPWebrequest (মাল্টিপার্ট / ফর্ম-ডেটা) দিয়ে ফাইলগুলি আপলোড করুন


298

এমন কোনও শ্রেণি, গ্রন্থাগার বা কোডের কিছু অংশ রয়েছে যা আমাকে HTTPWebrequest দিয়ে ফাইলগুলি আপলোড করতে সহায়তা করবে ?

সম্পাদনা 2:

আমি কোনও ওয়েবডিএভি ফোল্ডারে বা এর মতো কিছুতে আপলোড করতে চাই না। আমি একটি ব্রাউজার অনুকরণ করতে চাই, ঠিক যেমন আপনি কোনও ফোরামে আপনার অবতার আপলোড করেন বা ওয়েব অ্যাপ্লিকেশনে ফর্মের মাধ্যমে কোনও ফাইল আপলোড করেন। এমন কোনও ফর্মটিতে আপলোড করুন যা একটি বহুগুণ / ফর্ম-ডেটা ব্যবহার করে।

সম্পাদনা:

ওয়েবক্লিয়েন্ট আমার প্রয়োজনীয়তাগুলি আবরণ করে না, তাই আমি HTTPWebrequest সহ একটি সমাধান খুঁজছি ।


10
- এখানে সম্পর্কে এই একটি মহান ব্লগ পোস্ট paraesthesia.com/archive/2009/12/16/...
hwiechers

1
@ হুইচার্স: এটি এখানে অন্যান্য উত্তরগুলির তুলনায় সত্যই আমার পক্ষে কাজ করেছিল। আমাকে শুধু আমার কুকিজ যুক্ত করতে হয়েছিল।
টিম শেমলেটার

1
আপনি যদি .NET> = 4.0 ব্যবহার করেন তবে কাস্টম অবজেক্টের প্রয়োজন না এমন কোনও সমাধানের জন্য এই উত্তরটি দেখুন ।
জোশকোডস

উত্তর:


250

উপরের কোডটি নিয়ে গেছে এবং এটি ঠিক করা হয়েছে কারণ এটি অভ্যন্তরীণ সার্ভার ত্রুটি 500 টি ছুঁড়ে দেয়। R \ n খারাপভাবে অবস্থান এবং স্পেস ইত্যাদি নিয়ে কিছু সমস্যা রয়েছে memory ফলাফল এখানে:

    public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) {
        log.Debug(string.Format("Uploading {0} to {1}", file, url));
        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
        wr.ContentType = "multipart/form-data; boundary=" + boundary;
        wr.Method = "POST";
        wr.KeepAlive = true;
        wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

        Stream rs = wr.GetRequestStream();

        string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
        foreach (string key in nvc.Keys)
        {
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            string formitem = string.Format(formdataTemplate, key, nvc[key]);
            byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            rs.Write(formitembytes, 0, formitembytes.Length);
        }
        rs.Write(boundarybytes, 0, boundarybytes.Length);

        string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
        string header = string.Format(headerTemplate, paramName, file, contentType);
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
        rs.Write(headerbytes, 0, headerbytes.Length);

        FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
            rs.Write(buffer, 0, bytesRead);
        }
        fileStream.Close();

        byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
        rs.Write(trailer, 0, trailer.Length);
        rs.Close();

        WebResponse wresp = null;
        try {
            wresp = wr.GetResponse();
            Stream stream2 = wresp.GetResponseStream();
            StreamReader reader2 = new StreamReader(stream2);
            log.Debug(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
        } catch(Exception ex) {
            log.Error("Error uploading file", ex);
            if(wresp != null) {
                wresp.Close();
                wresp = null;
            }
        } finally {
            wr = null;
        }
    }

এবং নমুনা ব্যবহার:

    NameValueCollection nvc = new NameValueCollection();
    nvc.Add("id", "TTR");
    nvc.Add("btn-submit-photo", "Upload");
    HttpUploadFile("http://your.server.com/upload", 
         @"C:\test\test.jpg", "file", "image/jpeg", nvc);

এটি একাধিক ফাইল পরিচালনা করতে বা প্রতিটি ফাইলের জন্য একাধিকবার কল করার জন্য এটি বাড়ানো যেতে পারে। তবে এটি আপনার প্রয়োজন অনুসারে।


5
একটি যাদুমন্ত্র মত কাজ করে. অনেক ধন্যবাদ.
ইয়ু মাৎসুও

5
আমি এই কোডটি চেষ্টা করেছি তবে এটি জেপিগ ফাইলগুলি আপলোড করে না এবং এতে কোনও ত্রুটি পাওয়া যায় না? এটা কিভাবে সম্ভব.
ওড়হান সিনার

1
আমি যখন 1 এমবি-র মাধ্যমে ফাইল প্রেরণের চেষ্টা করি, তখন একটি 500 টি সার্ভার ত্রুটি পাওয়া যায়, 1 এমবি এর অধীনে ফাইলটি সূক্ষ্মভাবে কাজ করে, কীভাবে সম্ভব?
ডেভিড হোরাক

2
পূর্ববর্তী কলগুলির কুকিগুলি রাখতে আমি একটি আর.কুকি কনটেনার যুক্ত করেছি।
JoaquinG

8
আপনি যদি একাধিক ফাইল করার জন্য এটি প্রসারিত করতে চলেছেন, সতর্কতা অবলম্বন করুন: কেবল শেষ সীমানাটি 2 অতিরিক্ত ড্যাশ পায়: "\r\n--" + boundary + "--\r\n" অন্যথায় অতিরিক্ত ফাইলগুলি কেটে যাবে।
পিটার ড্রাইভার

143

আমি এটির মতো কিছু সন্ধান করছিলাম, এটিতে পাওয়া গেছে: http://bytes.com/groups/net-c/268661-how-upload-file-via-c-code (নির্ভুলতার জন্য পরিবর্তিত):

public static string UploadFilesToRemoteUrl(string url, string[] files, NameValueCollection formFields = null)
{
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
    request.ContentType = "multipart/form-data; boundary=" +
                            boundary;
    request.Method = "POST";
    request.KeepAlive = true;

    Stream memStream = new System.IO.MemoryStream();

    var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                            boundary + "\r\n");
    var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                boundary + "--");


    string formdataTemplate = "\r\n--" + boundary +
                                "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

    if (formFields != null)
    {
        foreach (string key in formFields.Keys)
        {
            string formitem = string.Format(formdataTemplate, key, formFields[key]);
            byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            memStream.Write(formitembytes, 0, formitembytes.Length);
        }
    }

    string headerTemplate =
        "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
        "Content-Type: application/octet-stream\r\n\r\n";

    for (int i = 0; i < files.Length; i++)
    {
        memStream.Write(boundarybytes, 0, boundarybytes.Length);
        var header = string.Format(headerTemplate, "uplTheFile", files[i]);
        var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

        memStream.Write(headerbytes, 0, headerbytes.Length);

        using (var fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[1024];
            var bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                memStream.Write(buffer, 0, bytesRead);
            }
        }
    }

    memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
    request.ContentLength = memStream.Length;

    using (Stream requestStream = request.GetRequestStream())
    {
        memStream.Position = 0;
        byte[] tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();
        requestStream.Write(tempBuffer, 0, tempBuffer.Length);
    }

    using (var response = request.GetResponse())
    {
        Stream stream2 = response.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);
        return reader2.ReadToEnd();
    }
}

9
এফওয়াইআই ... আপনি মধ্যবর্তী মেমরি স্ট্রিমটি রিফ্যাক্টর করতে পারেন এবং সরাসরি অনুরোধের স্ট্রিমে লিখতে পারেন। কীটি আপনার কাজ শেষ হয়ে গেলে অনুরোধের স্ট্রিমটি বন্ধ করে দেওয়া নিশ্চিত করা উচিত যা আপনার জন্য অনুরোধের সামগ্রীর দৈর্ঘ্য নির্ধারণ করে!
জন ক্লেটন

5
আমি একবার অতিরিক্ত স্থান সরিয়ে ফেললে এটি আমার পক্ষে কাজ করে। "r \ n বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / অকটেট-স্ট্রিম" "\ r \ n কনটেন্ট টাইপ: অ্যাপ্লিকেশন / অক্টেট-স্ট্রিম" হওয়া দরকার।
কার্ল বি

1
আমি এটিও দেখতে পেয়েছি যে শিরোনামের শেষে ডাবল \ r \ n সমস্যার কারণ হতে পারে। এর মধ্যে একটি মুছে ফেলা আমার সমস্যাগুলি স্থির করে।
হুগো এস্ট্রাদ

2
ঠিক আছে, এই কোড কাজ করে নি আমার জন্য, কিন্তু কোড একটি খৃস্টান আমার জন্য পুরোপুরি কাজ প্রথম যান - stackoverflow.com/questions/566462/... - আমি বিরুদ্ধে পরীক্ষা ছিল cgi-lib.berkeley.edu/ex/fup.html
সিভেরটেক্স

2
আমি জানি এটি একটি "পুরানো" জবাবযুক্ত প্রশ্ন তবে আমি কেবল এই সপ্তাহে এটি করার চেষ্টা করছিলাম। বর্তমান .NET ফ্রেমওয়ার্কের সাহায্যে আপনি কোড লাইন 3 লাইন এ সব করতে পারেন ... ওয়েবক্লিয়েন্ট ক্লায়েন্ট = নতুন ওয়েবক্লিয়েন্ট (); বাইট [] রেসপনবাইনারি = ক্লায়েন্ট।আপলোডফাই (ইউআরএল, ফাইল); স্ট্রিং ফলাফল = এনকোডিং.আউটএফ 8. গেটস্ট্রিং (রেসপন্সাইনারি);

106

আপডেট: .NET 4.5 (বা NuET থেকে মাইক্রোসফট. নেট.এইচটিপি প্যাকেজ যোগ করে .NET 4.0 ) ব্যবহার করে এটি বাহ্যিক কোড, এক্সটেনশন এবং "নিম্ন স্তরের" এইচটিটিপি ম্যানিপুলেশন ছাড়াই সম্ভব। এখানে একটি উদাহরণ:

// Perform the equivalent of posting a form with a filename and two files, in HTML:
// <form action="{url}" method="post" enctype="multipart/form-data">
//     <input type="text" name="filename" />
//     <input type="file" name="file1" />
//     <input type="file" name="file2" />
// </form>
private async Task<System.IO.Stream> UploadAsync(string url, string filename, Stream fileStream, byte [] fileBytes)
{
    // Convert each of the three inputs into HttpContent objects

    HttpContent stringContent = new StringContent(filename);
    // examples of converting both Stream and byte [] to HttpContent objects
    // representing input type file
    HttpContent fileStreamContent = new StreamContent(fileStream);
    HttpContent bytesContent = new ByteArrayContent(fileBytes);

    // Submit the form using HttpClient and 
    // create form data as Multipart (enctype="multipart/form-data")

    using (var client = new HttpClient())
    using (var formData = new MultipartFormDataContent()) 
    {
        // Add the HttpContent objects to the form data

        // <input type="text" name="filename" />
        formData.Add(stringContent, "filename", "filename");
        // <input type="file" name="file1" />
        formData.Add(fileStreamContent, "file1", "file1");
        // <input type="file" name="file2" />
        formData.Add(bytesContent, "file2", "file2");

        // Invoke the request to the server

        // equivalent to pressing the submit button on
        // a form with attributes (action="{url}" method="post")
        var response = await client.PostAsync(url, formData);

        // ensure the request was a success
        if (!response.IsSuccessStatusCode)
        {
            return null;
        }
        return await response.Content.ReadAsStreamAsync();
    }
}

2
মাইক্রোসফট. নেট.এইচটিপি নুগেট প্যাকেজ ব্যবহার করে 4.0 ব্যবহার করা যেতে পারে। দেখুন: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 11145053/…
amolbk

2
এটি প্রতিটি ফর্ম অংশের জন্য কাস্টম শিরোনাম সেট করে কিছু চমত্কার শক্তিশালী জিনিস করার সত্যিই সহজ উপায় being
জেসনআরশেভার

10
@ পিএইচপি-জ্যাকুয়ারি-প্রোগ্রামার, এটি জেনেরিক উদাহরণ কোড তাই পরামিতিগুলির জেনেরিক নাম রয়েছে। "পরম 1" কে "আপনার_স্বাস্থ্য_পরিচয়_প্রেম_এই" হিসাবে ভাবুন এবং দয়া করে আপনার -1 পুনর্বিবেচনা করুন।
জোশকোডস

3
প্যারাম 1 এর পরিবর্তে আপনি কী পরামর্শ দিচ্ছেন?
জোশকোডস

2
এটি ব্রোতে পরিবর্তন করার জন্য আমাকে একটি পরামর্শ দিন। "ফাইলের নাম" আপনার জন্য কাজ করে?
জোশকোডস

16

আমার এএসপি.নেট আপলোড প্রশ্নোত্তর এ সম্পর্কিত একটি নিবন্ধ রয়েছে উদাহরণস্বরূপ কোড সহ: একটি আরএফসি 1867 পোষ্ট অনুরোধ ব্যবহার করে ফাইলগুলি আপলোড করুন HTTPWebRequest / WebClient । এই কোড ফাইলগুলিকে মেমোরিতে লোড করে না (উপরের কোডের বিপরীতে), একাধিক ফাইল সমর্থন করে এবং ফর্মের মানগুলিকে সমর্থন করে, শংসাপত্র এবং কুকিজ সেট করে ইত্যাদি supports

সম্পাদনা: দেখে মনে হচ্ছে অ্যাকোসোফ্ট পৃষ্ঠাটি নামিয়েছে। ধন্যবাদ বন্ধুরা.

এটি সংরক্ষণাগার.অর্গের মাধ্যমে এখনও অ্যাক্সেসযোগ্য।


লিঙ্কের জন্য ধন্যবাদ ক্রিস আমি আসলে অন্যটিকে আমার নিজের লাইব্রেরিতে প্রয়োগ করেছি এবং সেগুলি সমর্থন করেছি (স্মৃতি ছাড়া অন্য)। ইতিমধ্যে VB.NET তে রূপান্তরিত হয়েছে :)
ডা। মন্দ

ধন্যবাদ, ক্রিস। এটি একটি টন সাহায্য!
ফ্লিপডব্যাট

প্রথম শ্রেণির সমাধান! অনেক ধন্যবাদ.
বব ডেনি

সতর্ক থাকুন জন্য ধন্যবাদ! দুর্ভাগ্যক্রমে, আমার কাছে এই সাইটের নিয়ন্ত্রণ নেই। আমি আর্কাইভ.আরজে পৃষ্ঠাটি (উত্স কোড সহ) পেয়েছি এবং সেই অনুযায়ী লিঙ্কটি আপডেট করেছি।
ক্রিস হাইনেস

15

উপরোক্ত কোডের ভিত্তিতে আমি একাধিক ফাইলের জন্য সমর্থন যুক্ত করেছি এবং স্থানীয় ফাইলের প্রয়োজন ছাড়াই সরাসরি একটি স্ট্রিম আপলোড করেছি।

কিছু পোস্ট প্যারাম সহ একটি নির্দিষ্ট url এ ফাইলগুলি আপলোড করতে নিম্নলিখিতগুলি করুন:

RequestHelper.PostMultipart(
    "http://www.myserver.com/upload.php", 
    new Dictionary<string, object>() {
        { "testparam", "my value" },
        { "file", new FormFile() { Name = "image.jpg", ContentType = "image/jpeg", FilePath = "c:\\temp\\myniceimage.jpg" } },
        { "other_file", new FormFile() { Name = "image2.jpg", ContentType = "image/jpeg", Stream = imageDataStream } },
    });

এটি আরও বাড়ানোর জন্য আরও একটি প্রদত্ত ফাইল থেকে নিজের নাম এবং মাইম প্রকার নির্ধারণ করতে পারে।

public class FormFile 
{
    public string Name { get; set; }

    public string ContentType { get; set; }

    public string FilePath { get; set; }

    public Stream Stream { get; set; }
}

public class RequestHelper
{

    public static string PostMultipart(string url, Dictionary<string, object> parameters) {

        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        request.Method = "POST";
        request.KeepAlive = true;
        request.Credentials = System.Net.CredentialCache.DefaultCredentials;

        if(parameters != null && parameters.Count > 0) {

            using(Stream requestStream = request.GetRequestStream()) {

                foreach(KeyValuePair<string, object> pair in parameters) {

                    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                    if(pair.Value is FormFile) {
                        FormFile file = pair.Value as FormFile;
                        string header = "Content-Disposition: form-data; name=\"" + pair.Key + "\"; filename=\"" + file.Name + "\"\r\nContent-Type: " + file.ContentType + "\r\n\r\n";
                        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(header);
                        requestStream.Write(bytes, 0, bytes.Length);
                        byte[] buffer = new byte[32768];
                        int bytesRead;
                        if(file.Stream == null) {
                            // upload from file
                            using(FileStream fileStream = File.OpenRead(file.FilePath)) {
                                while((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                                    requestStream.Write(buffer, 0, bytesRead);
                                fileStream.Close();
                            }
                        }
                        else {
                            // upload from given stream
                            while((bytesRead = file.Stream.Read(buffer, 0, buffer.Length)) != 0)
                                requestStream.Write(buffer, 0, bytesRead);
                        }
                    }
                    else {
                        string data = "Content-Disposition: form-data; name=\"" + pair.Key + "\"\r\n\r\n" + pair.Value;
                        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);
                        requestStream.Write(bytes, 0, bytes.Length);
                    }
                }

                byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                requestStream.Write(trailer, 0, trailer.Length);
                requestStream.Close();
            }
        }

        using(WebResponse response = request.GetResponse()) {
            using(Stream responseStream = response.GetResponseStream())
            using(StreamReader reader = new StreamReader(responseStream))
                return reader.ReadToEnd();
        }


    }
}

বিষয়বস্তুর ধরণটি বহুগুণ / সম্পর্কিত হলে কি কিছু পরিবর্তন হবে?
সোম ভট্টাচার্য

12

এর মতো কিছু কাছাকাছি: (অরক্ষিত কোড)

byte[] data; // data goes here.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = userNetworkCredentials;
request.Method = "PUT";
request.ContentType = "application/octet-stream";
request.ContentLength = data.Length;
Stream stream = request.GetRequestStream();
stream.Write(data,0,data.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
temp = reader.ReadToEnd();
reader.Close();

ধন্যবাদ কিনুন আমি কোনও ওয়েবডিএভি বা অনুরূপ সমাধানের পরে নেই, আমি আমার উত্তর পরিষ্কার করে দিয়েছি। সম্পাদনা দেখুন।
ড। খারাপ

6

আমি মনে করি আপনি ওয়েবক্লিয়েন্টের মতো আরও কিছু খুঁজছেন ।

বিশেষত, আপলোড ফাইল ()


2
এটি HTTPWebrequest এর সাথে হওয়া উচিত, আমি ওয়েবক্লিয়েন্ট জানি তবে এটি এই প্রকল্পের পক্ষে ভাল নয়।
ড। অশুভ

6

উপরের অংশটি নিয়েছে এবং এটি পরিবর্তিত হয়েছে যা কিছু শিরোনাম মান এবং একাধিক ফাইল গ্রহণ করে

    NameValueCollection headers = new NameValueCollection();
        headers.Add("Cookie", "name=value;");
        headers.Add("Referer", "http://google.com");
    NameValueCollection nvc = new NameValueCollection();
        nvc.Add("name", "value");

    HttpUploadFile(url, new string[] { "c:\\file1.txt", "c:\\file2.jpg" }, new string[] { "file", "image" }, new string[] { "application/octet-stream", "image/jpeg" }, nvc, headers);

public static void HttpUploadFile(string url, string[] file, string[] paramName, string[] contentType, NameValueCollection nvc, NameValueCollection headerItems)
{
    //log.Debug(string.Format("Uploading {0} to {1}", file, url));
    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);

    foreach (string key in headerItems.Keys)
    {
        if (key == "Referer")
        {
            wr.Referer = headerItems[key];
        }
        else
        {
            wr.Headers.Add(key, headerItems[key]);
        }
    }

    wr.ContentType = "multipart/form-data; boundary=" + boundary;
    wr.Method = "POST";
    wr.KeepAlive = true;
    wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

    Stream rs = wr.GetRequestStream();

    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    foreach (string key in nvc.Keys)
    {
        rs.Write(boundarybytes, 0, boundarybytes.Length);
        string formitem = string.Format(formdataTemplate, key, nvc[key]);
        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
        rs.Write(formitembytes, 0, formitembytes.Length);
    }
    rs.Write(boundarybytes, 0, boundarybytes.Length);

    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    string header = "";

    for(int i =0; i<file.Count();i++)
    {
        header = string.Format(headerTemplate, paramName[i], System.IO.Path.GetFileName(file[i]), contentType[i]);
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
        rs.Write(headerbytes, 0, headerbytes.Length);

        FileStream fileStream = new FileStream(file[i], FileMode.Open, FileAccess.Read);
        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            rs.Write(buffer, 0, bytesRead);
        }
        fileStream.Close();
        rs.Write(boundarybytes, 0, boundarybytes.Length);
    }
    rs.Close();

    WebResponse wresp = null;
    try
    {
        wresp = wr.GetResponse();
        Stream stream2 = wresp.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);
        //log.Debug(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
    }
    catch (Exception ex)
    {
        //log.Error("Error uploading file", ex);
            wresp.Close();
            wresp = null;
    }
    finally
    {
        wr = null;
    }
}

আমি শেষ সীমানা প্রবেশকে পরিবর্তন না করা পর্যন্ত এটি আমার পক্ষে কাজ করে না work শেষ ফাইলটির শেষে সীমানাটি দুটি ড্যাশ রয়েছে তা নিশ্চিত করুন\r\n--" + boundary + "--\r\n
বেন রিপলে

5

ভিবি উদাহরণ (অন্য পোস্টে সি # উদাহরণ থেকে রূপান্তরিত):

Private Sub HttpUploadFile( _
    ByVal uri As String, _
    ByVal filePath As String, _
    ByVal fileParameterName As String, _
    ByVal contentType As String, _
    ByVal otherParameters As Specialized.NameValueCollection)

    Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")
    Dim newLine As String = System.Environment.NewLine
    Dim boundaryBytes As Byte() = Text.Encoding.ASCII.GetBytes(newLine & "--" & boundary & newLine)
    Dim request As Net.HttpWebRequest = Net.WebRequest.Create(uri)

    request.ContentType = "multipart/form-data; boundary=" & boundary
    request.Method = "POST"
    request.KeepAlive = True
    request.Credentials = Net.CredentialCache.DefaultCredentials

    Using requestStream As IO.Stream = request.GetRequestStream()

        Dim formDataTemplate As String = "Content-Disposition: form-data; name=""{0}""{1}{1}{2}"

        For Each key As String In otherParameters.Keys

            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
            Dim formItem As String = String.Format(formDataTemplate, key, newLine, otherParameters(key))
            Dim formItemBytes As Byte() = Text.Encoding.UTF8.GetBytes(formItem)
            requestStream.Write(formItemBytes, 0, formItemBytes.Length)

        Next key

        requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)

        Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}Content-Type: {3}{2}{2}"
        Dim header As String = String.Format(headerTemplate, fileParameterName, filePath, newLine, contentType)
        Dim headerBytes As Byte() = Text.Encoding.UTF8.GetBytes(header)
        requestStream.Write(headerBytes, 0, headerBytes.Length)

        Using fileStream As New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)

            Dim buffer(4096) As Byte
            Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)

            Do While (bytesRead > 0)

                requestStream.Write(buffer, 0, bytesRead)
                bytesRead = fileStream.Read(buffer, 0, buffer.Length)

            Loop

        End Using

        Dim trailer As Byte() = Text.Encoding.ASCII.GetBytes(newLine & "--" + boundary + "--" & newLine)
        requestStream.Write(trailer, 0, trailer.Length)

    End Using

    Dim response As Net.WebResponse = Nothing

    Try

        response = request.GetResponse()

        Using responseStream As IO.Stream = response.GetResponseStream()

            Using responseReader As New IO.StreamReader(responseStream)

                Dim responseText = responseReader.ReadToEnd()
                Diagnostics.Debug.Write(responseText)

            End Using

        End Using

    Catch exception As Net.WebException

        response = exception.Response

        If (response IsNot Nothing) Then

            Using reader As New IO.StreamReader(response.GetResponseStream())

                Dim responseText = reader.ReadToEnd()
                Diagnostics.Debug.Write(responseText)

            End Using

            response.Close()

        End If

    Finally

        request = Nothing

    End Try

End Sub

4

আমাকে সাম্প্রতিককালে এটি মোকাবেলা করতে হয়েছিল - এর কাছে যাওয়ার আরও একটি উপায় হ'ল ওয়েবক্লিয়েন্টটি উত্তরাধিকারসূত্রে প্রাপ্ত সত্যটি ব্যবহার করা এবং সেখান থেকে অন্তর্নিহিত ওয়েবরিকাউন্ট পরিবর্তন করা:

http://msdn.microsoft.com/en-us/library/system.net.webclient.getwebrequest(VS.80).aspx

আমি সি # টি পছন্দ করি তবে আপনি যদি ভিবিতে আটকে থাকেন তবে ফলাফলগুলি এরকম দেখতে পাবেন:

Public Class BigWebClient
    Inherits WebClient
    Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
        Dim x As WebRequest = MyBase.GetWebRequest(address)
        x.Timeout = 60 * 60 * 1000
        Return x
    End Function
End Class

'Use BigWebClient here instead of WebClient

+1 তবুও ওয়েবক্লিয়েন্টটি খুব অ-কাস্টমাইজযোগ্য তাই এটি বাস্তবায়ন করা জটিলতর হবে, তবে এটি একটি সত্যই আকর্ষণীয় পদ্ধতি এবং আমি জানি না যে এটি সম্ভব হয়েছিল।
ড। মন্দ

3

আমার মন্তব্যগুলির সাথে আরও একটি কার্যকারী উদাহরণ রয়েছে:

        List<MimePart> mimeParts = new List<MimePart>();

        try
        {
            foreach (string key in form.AllKeys)
            {
                StringMimePart part = new StringMimePart();

                part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
                part.StringData = form[key];

                mimeParts.Add(part);
            }

            int nameIndex = 0;

            foreach (UploadFile file in files)
            {
                StreamMimePart part = new StreamMimePart();

                if (string.IsNullOrEmpty(file.FieldName))
                    file.FieldName = "file" + nameIndex++;

                part.Headers["Content-Disposition"] = "form-data; name=\"" + file.FieldName + "\"; filename=\"" + file.FileName + "\"";
                part.Headers["Content-Type"] = file.ContentType;

                part.SetStream(file.Data);

                mimeParts.Add(part);
            }

            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");

            req.ContentType = "multipart/form-data; boundary=" + boundary;
            req.Method = "POST";

            long contentLength = 0;

            byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");

            foreach (MimePart part in mimeParts)
            {
                contentLength += part.GenerateHeaderFooterData(boundary);
            }

            req.ContentLength = contentLength + _footer.Length;

            byte[] buffer = new byte[8192];
            byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
            int read;

            using (Stream s = req.GetRequestStream())
            {
                foreach (MimePart part in mimeParts)
                {
                    s.Write(part.Header, 0, part.Header.Length);

                    while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
                        s.Write(buffer, 0, read);

                    part.Data.Dispose();

                    s.Write(afterFile, 0, afterFile.Length);
                }

                s.Write(_footer, 0, _footer.Length);
            }

            return (HttpWebResponse)req.GetResponse();
        }
        catch
        {
            foreach (MimePart part in mimeParts)
                if (part.Data != null)
                    part.Data.Dispose();

            throw;
        }

এবং ব্যবহারের উদাহরণ রয়েছে:

            UploadFile[] files = new UploadFile[] 
            { 
                new UploadFile(@"C:\2.jpg","new_file","image/jpeg") //new_file is id of upload field
            };

            NameValueCollection form = new NameValueCollection();

            form["id_hidden_input"] = "value_hidden_inpu"; //there is additional param (hidden fields on page)


            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(full URL of action);

            // set credentials/cookies etc. 
            req.CookieContainer = hrm.CookieContainer; //hrm is my class. i copied all cookies from last request to current (for auth)
            HttpWebResponse resp = HttpUploadHelper.Upload(req, files, form);

            using (Stream s = resp.GetResponseStream())
            using (StreamReader sr = new StreamReader(s))
            {
                string response = sr.ReadToEnd();
            }
             //profit!

2

আমি ফাইল আপলোড করার চেষ্টা করছিলাম এবং ভিবি.এনইটি তে একটি মাল্টিপার্ট / ফর্ম-ডেটা অনুরোধে কিছু পরামিতি যুক্ত করব এবং নিয়মিত ফর্ম পোস্টের মাধ্যমে নয়। @ জোশকোডস জবাবের জন্য ধন্যবাদ আমি যে দিকটি খুঁজছিলাম তা পেয়েছি। আমি আমার সমাধান পোস্ট করছি অন্যকে ফাইল এবং প্যারামিটার উভয়ই পোস্ট সম্পাদন করার উপায় খুঁজে পেতে আমি যা অর্জন করতে চাইছি তার সমতুল্য এইচটিএমএল: এইচটিএমএল

<form action="your-api-endpoint" enctype="multipart/form-data" method="post"> 
<input type="hidden" name="action" value="api-method-name"/> 
<input type="hidden" name="apiKey" value="gs1xxxxxxxxxxxxxex"/> 
<input type="hidden" name="access" value="protected"/> 
<input type="hidden" name="name" value="test"/> 
<input type="hidden" name="title" value="test"/> 
<input type="hidden" name="signature" value="cf1d4xxxxxxxxcd5"/> 
<input type="file" name="file"/> 
<input type="submit" name="_upload" value="Upload"/> 
</form>

আমাকে এপিকে এবং স্বাক্ষর (যা অনুরোধের প্যারামিটারগুলির একটি গণনা করা চেকসাম এবং এপিআই কী সংক্ষিপ্ত স্ট্রিং) সরবরাহ করতে হবে তার কারণে, আমার এটি সার্ভারের পাশেই করা দরকার। সার্ভারের পাশ দিয়ে আমার অন্য যে কারণটি করা দরকার ছিল তা হ'ল সার্ভারে থাকা কোনও ফাইলের দিকে ইঙ্গিত করে (পোস্টটি সরবরাহ করা) ফাইল পোস্টটি যে কোনও সময় সম্পাদন করা যেতে পারে, সুতরাং ফর্ম চলাকালীন কোনও ম্যানুয়ালি সিলেক্ট করা ফাইল থাকবে না এইভাবে পোস্ট ফর্ম ডেটা ফাইলটিতে ফাইল স্ট্রিম থাকবে না ther অন্যদিকে আমি একটি এজ্যাক্স কলব্যাকের মাধ্যমে চেকসামটি গণনা করতে এবং JQuery ব্যবহার করে এইচটিএমএল পোস্টের মাধ্যমে ফাইলটি জমা দিতে পারতাম। আমি। নেট সংস্করণ 4.0 ব্যবহার করছি এবং আসল সমাধানে 4.5 এ আপগ্রেড করতে পারি না। সুতরাং আমাকে মাইক্রোসফ্ট. নেট.হট্ট পিটিউশন ব্যবহার করে নুগেট সিএমডি ব্যবহার করতে হবে

PM> install-package Microsoft.Net.Http

Private Function UploadFile(req As ApiRequest, filePath As String, fileName As String) As String
    Dim result = String.empty
    Try
        ''//Get file stream
        Dim paramFileStream As Stream = File.OpenRead(filePath)
        Dim fileStreamContent As HttpContent = New  StreamContent(paramFileStream)
        Using client = New HttpClient()
            Using formData = New MultipartFormDataContent()
                ''// This adds parameter name ("action")
                ''// parameter value (req.Action) to form data
                formData.Add(New StringContent(req.Action), "action")
                formData.Add(New StringContent(req.ApiKey), "apiKey")
                For Each param In req.Parameters
                    formData.Add(New StringContent(param.Value), param.Key)
                Next
                formData.Add(New StringContent(req.getRequestSignature.Qualifier), "signature")
                ''//This adds the file stream and file info to form data
                formData.Add(fileStreamContent, "file", fileName)
                ''//We are now sending the request
                Dim response = client.PostAsync(GetAPIEndpoint(), formData).Result
                ''//We are here reading the response
                Dim readR = New StreamReader(response.Content.ReadAsStreamAsync().Result, Encoding.UTF8)
                Dim respContent = readR.ReadToEnd()

                If Not response.IsSuccessStatusCode Then
                    result =  "Request Failed : Code = " & response.StatusCode & "Reason = " & response.ReasonPhrase & "Message = " & respContent
                End If
                result.Value = respContent
            End Using
        End Using
    Catch ex As Exception
        result = "An error occurred : " & ex.Message
    End Try

    Return result
End Function

2

মেমরি স্ট্রিমের সাথে কাজ করতে, ক্রিশ্চিয়ানআরমনেস্কু কোডটি পরিবর্তিত, ফাইলকে বাইট অ্যারে হিসাবে গ্রহণ করুন, নাল এনভিসিকে অনুমতি দিন, অনুরোধের প্রতিক্রিয়া ফেরত দিন এবং অনুমোদন-শিরোনামের সাথে কাজ করুন। ওয়েব এপিআই 2 দিয়ে কোডটি পরীক্ষিত।

private string HttpUploadFile(string url, byte[] file, string fileName, string paramName, string contentType, NameValueCollection nvc, string authorizationHeader)
{
    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    wr.ContentType = "multipart/form-data; boundary=" + boundary;
    wr.Method = "POST";
    wr.Headers.Add("Authorization", authorizationHeader);
    wr.KeepAlive = true;

    Stream rs = wr.GetRequestStream();

    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    if (nvc != null)
    {
        foreach (string key in nvc.Keys)
        {
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            string formitem = string.Format(formdataTemplate, key, nvc[key]);
            byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            rs.Write(formitembytes, 0, formitembytes.Length);
        }
    }

    rs.Write(boundarybytes, 0, boundarybytes.Length);

    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    string header = string.Format(headerTemplate, paramName, fileName, contentType);
    byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
    rs.Write(headerbytes, 0, headerbytes.Length);

    rs.Write(file, 0, file.Length);

    byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    rs.Write(trailer, 0, trailer.Length);
    rs.Close();

    WebResponse wresp = null;
    try
    {
        wresp = wr.GetResponse();
        Stream stream2 = wresp.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);
        var response = reader2.ReadToEnd();
        return response;
    }
    catch (Exception ex)
    {
        if (wresp != null)
        {
            wresp.Close();
            wresp = null;
        }
        return null;
    }
    finally
    {
        wr = null;
    }
}

Testcode:

[HttpPost]
[Route("postformdata")]
public IHttpActionResult PostFormData()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();

    try
    {
        // Read the form data.
        var result = Request.Content.ReadAsMultipartAsync(provider).Result;
        string response = "";
        // This illustrates how to get the file names.
        foreach (var file in provider.Contents)
        {
            var fileName = file.Headers.ContentDisposition.FileName.Trim('\"');
            var buffer =  file.ReadAsByteArrayAsync().Result;
            response = HttpUploadFile("https://localhost/api/v1/createfromfile", buffer, fileName, "file", "application/pdf", null, "AuthorizationKey");
        }
        return Ok(response);
    }
    catch (System.Exception e)
    {
        return InternalServerError();
    }
}

আমার জন্য ভাল কাজ করেছে - আমার একটি বাইট দিয়ে আপলোড করা দরকার []। ধন্যবাদ!
ডিকার

1

আমার জন্য, নিম্নলিখিত কাজগুলি (বেশিরভাগ নীচের সমস্ত উত্তর থেকে অনুপ্রাণিত), আমি এলাদের উত্তর থেকে শুরু করেছি এবং আমার প্রয়োজনের সাথে মেলে জিনিসগুলি সংশোধন / সরলকরণ করেছি (ফর্ম ফর্মগুলি নয়, কেবল একটি ফাইলই সরান, ...)।

আশা করি এটি কাউকে সহায়তা করতে পারে :)

(পিএস: আমি জানি যে ব্যতিক্রম হ্যান্ডলিং প্রয়োগ করা হয়নি এবং এটি ধরে নেওয়া হয় যে এটি কোনও শ্রেণীর ভিতরে লেখা হয়েছিল, তাই আমার কিছু সংহতকরণের প্রচেষ্টা প্রয়োজন হতে পারে ...)

private void uploadFile()
    {
        Random rand = new Random();
        string boundary = "----boundary" + rand.Next().ToString();
        Stream data_stream;
        byte[] header = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"file_path\"; filename=\"" + System.IO.Path.GetFileName(this.file) + "\"\r\nContent-Type: application/octet-stream\r\n\r\n");
        byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

        // Do the request
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(MBF_URL);
        request.UserAgent = "My Toolbox";
        request.Method = "POST";
        request.KeepAlive = true;
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        data_stream = request.GetRequestStream();
        data_stream.Write(header, 0, header.Length);
        byte[] file_bytes = System.IO.File.ReadAllBytes(this.file);
        data_stream.Write(file_bytes, 0, file_bytes.Length);
        data_stream.Write(trailer, 0, trailer.Length);
        data_stream.Close();

        // Read the response
        WebResponse response = request.GetResponse();
        data_stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(data_stream);
        this.url = reader.ReadToEnd();

        if (this.url == "") { this.url = "No response :("; }

        reader.Close();
        data_stream.Close();
        response.Close();
    }

দীর্ঘ উত্তরের চমৎকার সারসংক্ষেপ। দ্রষ্টব্য: আপনার কোডটি ব্যবহার করার সময় আমি 400 টির খারাপ অনুরোধ পেয়েছি এবং প্রথম সীমানার আগে নেতৃস্থানীয় \ r \ n অপসারণ করতে হবে
জেম্যান্ড 771

1

এটি আগে পোস্ট করা হয়েছে কিনা তা নিশ্চিত নই তবে আমি ওয়েবক্লিয়েন্টের সাথে এটির কাজ পেয়েছি। আমি ওয়েবক্লিয়েন্টের জন্য ডকুমেন্টেশন পড়েছি। তারা একটি মূল বিষয়

যদি বেসএড্রেস বৈশিষ্ট্যটি খালি স্ট্রিং ("") না হয় এবং ঠিকানায় কোনও সম্পূর্ণ ইউআরআই থাকে না তবে অনুরোধ করা ডেটার নিখুঁত ইউআরআই গঠনের জন্য ঠিকানাটি অবশ্যই একটি সম্পর্কিত ইউআরআই হতে হবে যা বেসএড্রেসিসের সাথে মিলিত হবে। যদি কোয়েরিস্ট্রিং সম্পত্তিটি খালি স্ট্রিং না হয় তবে এটি ঠিকানা যুক্ত করা হবে।

সুতরাং আমি যা করেছি তা হল wc.QueryString.Add ("উত্স", উত্পন্ন চিত্র) বিভিন্ন ক্যোয়ারী প্যারামিটার যুক্ত করতে এবং কোনওভাবে এটি আমার আপলোডকৃত চিত্রটির সাথে সম্পত্তির নামের সাথে মেলে। আশা করি এটা সাহায্য করবে

    public void postImageToFacebook(string generatedImage, string fbGraphUrl)
    {
        WebClient wc = new WebClient();
        byte[] bytes = System.IO.File.ReadAllBytes(generatedImage);

        wc.QueryString.Add("source", generatedImage);
        wc.QueryString.Add("message", "helloworld");

        wc.UploadFile(fbGraphUrl, generatedImage);

        wc.Dispose();

    }

1

আমি যখন মাল্টিপার্ট ফর্ম আপলোড করব তখন ওয়েবক্লিয়েন্টের সাহায্যে একটি ক্লাস লিখেছিলাম।

http://ferozedaud.blogspot.com/2010/03/multipart-form-upload-helper.html

/// 
/// MimePart
/// Abstract class for all MimeParts
/// 

abstract class MimePart
{
    public string Name { get; set; }

    public abstract string ContentDisposition { get; }

    public abstract string ContentType { get; }

    public abstract void CopyTo(Stream stream);

    public String Boundary
    {
        get;
        set;
    }
}

class NameValuePart : MimePart
{
    private NameValueCollection nameValues;

    public NameValuePart(NameValueCollection nameValues)
    {
        this.nameValues = nameValues;
    }

    public override void CopyTo(Stream stream)
    {
        string boundary = this.Boundary;
        StringBuilder sb = new StringBuilder();

        foreach (object element in this.nameValues.Keys)
        {
            sb.AppendFormat("--{0}", boundary);
            sb.Append("\r\n");
            sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\";", element);
            sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append(this.nameValues[element.ToString()]);

            sb.Append("\r\n");

        }

        sb.AppendFormat("--{0}", boundary);
        sb.Append("\r\n");

        //Trace.WriteLine(sb.ToString());
        byte [] data = Encoding.ASCII.GetBytes(sb.ToString());
        stream.Write(data, 0, data.Length);
    }

    public override string ContentDisposition
    {
        get { return "form-data"; }
    }

    public override string ContentType
    {
        get { return String.Empty; }
    }
} 

class FilePart : MimePart

{

    private Stream input;

    private String contentType;



    public FilePart(Stream input, String name, String contentType)

    {

        this.input = input;

        this.contentType = contentType;

        this.Name = name;

    }



    public override void CopyTo(Stream stream)

    {

        StringBuilder sb = new StringBuilder();

        sb.AppendFormat("Content-Disposition: {0}", this.ContentDisposition);

        if (this.Name != null)

            sb.Append("; ").AppendFormat("name=\"{0}\"", this.Name);

        if (this.FileName != null)

            sb.Append("; ").AppendFormat("filename=\"{0}\"", this.FileName);

        sb.Append("\r\n");

        sb.AppendFormat(this.ContentType);

        sb.Append("\r\n");

        sb.Append("\r\n");



    // serialize the header data.

    byte[] buffer = Encoding.ASCII.GetBytes(sb.ToString());

    stream.Write(buffer, 0, buffer.Length);



    // send the stream.

    byte[] readBuffer = new byte[1024];

    int read = input.Read(readBuffer, 0, readBuffer.Length);

    while (read > 0)

    {

        stream.Write(readBuffer, 0, read);

        read = input.Read(readBuffer, 0, readBuffer.Length);

    }



    // write the terminating boundary

    sb.Length = 0;

    sb.Append("\r\n");

    sb.AppendFormat("--{0}", this.Boundary);

    sb.Append("\r\n");

    buffer = Encoding.ASCII.GetBytes(sb.ToString());

    stream.Write(buffer, 0, buffer.Length);



}

 public override string ContentDisposition
 {
      get { return "file"; }
 }



 public override string ContentType
 {
    get { 
       return String.Format("content-type: {0}", this.contentType); 
     }
 }

 public String FileName { get; set; }

}

    /// 
    /// Helper class that encapsulates all file uploads
    /// in a mime part.
    /// 

    class FilesCollection : MimePart
    {
        private List files;

        public FilesCollection()
        {
            this.files = new List();
            this.Boundary = MultipartHelper.GetBoundary();
        }

        public int Count
        {
            get { return this.files.Count; }
        }

        public override string ContentDisposition
        {
            get
            {
                return String.Format("form-data; name=\"{0}\"", this.Name);
            }
        }

        public override string ContentType
        {
            get { return String.Format("multipart/mixed; boundary={0}", this.Boundary); }
        }

        public override void CopyTo(Stream stream)
        {
            // serialize the headers
            StringBuilder sb = new StringBuilder(128);
            sb.Append("Content-Disposition: ").Append(this.ContentDisposition).Append("\r\n");
            sb.Append("Content-Type: ").Append(this.ContentType).Append("\r\n");
            sb.Append("\r\n");
            sb.AppendFormat("--{0}", this.Boundary).Append("\r\n");

            byte[] headerBytes = Encoding.ASCII.GetBytes(sb.ToString());
            stream.Write(headerBytes, 0, headerBytes.Length);
            foreach (FilePart part in files)
            {
                part.Boundary = this.Boundary;
                part.CopyTo(stream);
            }
        }

        public void Add(FilePart part)
        {
            this.files.Add(part);
        }
    }

/// 
/// Helper class to aid in uploading multipart
/// entities to HTTP web endpoints.
/// 

class MultipartHelper
{
    private static Random random = new Random(Environment.TickCount);

    private List formData = new List();
    private FilesCollection files = null;
    private MemoryStream bufferStream = new MemoryStream();
    private string boundary;

    public String Boundary { get { return boundary; } }

    public static String GetBoundary()
    {
        return Environment.TickCount.ToString("X");
    }

    public MultipartHelper()
    {
        this.boundary = MultipartHelper.GetBoundary();
    }

    public void Add(NameValuePart part)
    {
        this.formData.Add(part);
        part.Boundary = boundary;
    }

    public void Add(FilePart part)
    {
        if (files == null)
        {
            files = new FilesCollection();
        }
        this.files.Add(part);
    }

    public void Upload(WebClient client, string address, string method)
    {
        // set header
        client.Headers.Add(HttpRequestHeader.ContentType, "multipart/form-data; boundary=" + this.boundary);
        Trace.WriteLine("Content-Type: multipart/form-data; boundary=" + this.boundary + "\r\n");

        // first, serialize the form data
        foreach (NameValuePart part in this.formData)
        {
            part.CopyTo(bufferStream);
        }

        // serialize the files.
        this.files.CopyTo(bufferStream);

        if (this.files.Count > 0)
        {
            // add the terminating boundary.
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("--{0}", this.Boundary).Append("\r\n");
            byte [] buffer = Encoding.ASCII.GetBytes(sb.ToString());
            bufferStream.Write(buffer, 0, buffer.Length);
        }

        bufferStream.Seek(0, SeekOrigin.Begin);

        Trace.WriteLine(Encoding.ASCII.GetString(bufferStream.ToArray()));
        byte [] response = client.UploadData(address, method, bufferStream.ToArray());
        Trace.WriteLine("----- RESPONSE ------");
        Trace.WriteLine(Encoding.ASCII.GetString(response));
    }

    /// 
    /// Helper class that encapsulates all file uploads
    /// in a mime part.
    /// 

    class FilesCollection : MimePart
    {
        private List files;

        public FilesCollection()
        {
            this.files = new List();
            this.Boundary = MultipartHelper.GetBoundary();
        }

        public int Count
        {
            get { return this.files.Count; }
        }

        public override string ContentDisposition
        {
            get
            {
                return String.Format("form-data; name=\"{0}\"", this.Name);
            }
        }

        public override string ContentType
        {
            get { return String.Format("multipart/mixed; boundary={0}", this.Boundary); }
        }

        public override void CopyTo(Stream stream)
        {
            // serialize the headers
            StringBuilder sb = new StringBuilder(128);
            sb.Append("Content-Disposition: ").Append(this.ContentDisposition).Append("\r\n");
            sb.Append("Content-Type: ").Append(this.ContentType).Append("\r\n");
            sb.Append("\r\n");
            sb.AppendFormat("--{0}", this.Boundary).Append("\r\n");

            byte[] headerBytes = Encoding.ASCII.GetBytes(sb.ToString());
            stream.Write(headerBytes, 0, headerBytes.Length);
            foreach (FilePart part in files)
            {
                part.Boundary = this.Boundary;
                part.CopyTo(stream);
            }
        }

        public void Add(FilePart part)
        {
            this.files.Add(part);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Trace.Listeners.Add(new ConsoleTraceListener());
        try
        {
            using (StreamWriter sw = new StreamWriter("testfile.txt", false))
            {
                sw.Write("Hello there!");
            }

            using (Stream iniStream = File.OpenRead(@"c:\platform.ini"))
            using (Stream fileStream = File.OpenRead("testfile.txt"))
            using (WebClient client = new WebClient())
            {
                MultipartHelper helper = new MultipartHelper();

                NameValueCollection props = new NameValueCollection();
                props.Add("fname", "john");
                props.Add("id", "acme");
                helper.Add(new NameValuePart(props));

                FilePart filepart = new FilePart(fileStream, "pics1", "text/plain");
                filepart.FileName = "1.jpg";
                helper.Add(filepart);

                FilePart ini = new FilePart(iniStream, "pics2", "text/plain");
                ini.FileName = "inifile.ini";
                helper.Add(ini);

                helper.Upload(client, "http://localhost/form.aspx", "POST");
            }
        }
        catch (Exception e)
        {
            Trace.WriteLine(e);
        }
    }
}

এটি .NET ফ্রেমওয়ার্কের সমস্ত সংস্করণের সাথে কাজ করবে।


0

আমি উদাহরণগুলি কখনই সঠিকভাবে কাজ করতে পারি না, সার্ভারে প্রেরণ করার সময় আমি সর্বদা 500 ত্রুটি পাই receive

তবে আমি এই url এ এটি করার একটি খুব মার্জিত পদ্ধতি জুড়ে এসেছি

এটি সহজেই প্রসারযোগ্য এবং স্পষ্টতই বাইনারি ফাইলগুলির পাশাপাশি এক্সএমএল এর সাথে কাজ করে।

আপনি এটি এর অনুরূপ কিছু ব্যবহার করে এটি কল করেন

class Program
{
    public static string gsaFeedURL = "http://yourGSA.domain.com:19900/xmlfeed";

    static void Main()
    {
        try
        {
            postWebData();
        }
        catch (Exception ex)
        {
        }
    }

    // new one I made from C# web service
    public static void postWebData()
    {
        StringDictionary dictionary = new StringDictionary();
        UploadSpec uploadSpecs = new UploadSpec();
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] bytes;
        Uri gsaURI = new Uri(gsaFeedURL);  // Create new URI to GSA feeder gate
        string sourceURL = @"C:\FeedFile.xml"; // Location of the XML feed file
        // Two parameters to send
        string feedtype = "full";
        string datasource = "test";            

        try
        {
            // Add the parameter values to the dictionary
            dictionary.Add("feedtype", feedtype);
            dictionary.Add("datasource", datasource);

            // Load the feed file created and get its bytes
            XmlDocument xml = new XmlDocument();
            xml.Load(sourceURL);
            bytes = Encoding.UTF8.GetBytes(xml.OuterXml);

            // Add data to upload specs
            uploadSpecs.Contents = bytes;
            uploadSpecs.FileName = sourceURL;
            uploadSpecs.FieldName = "data";

            // Post the data
            if ((int)HttpUpload.Upload(gsaURI, dictionary, uploadSpecs).StatusCode == 200)
            {
                Console.WriteLine("Successful.");
            }
            else
            {
                // GSA POST not successful
                Console.WriteLine("Failure.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}


0

ক্লায়েন্টের ব্যবহার ToBase64Stringফাইলকে রূপান্তর করে , এক্সএমএল ব্যবহারের পরে সার্ভার কলটিতে প্রচার করার জন্য, এই সার্ভারটি ব্যবহার করে File.WriteAllBytes(path,Convert.FromBase64String(dataFile_Client_sent))

ভাল কপাল!


0

এই পদ্ধতিটি একসাথে একাধিক চিত্র আপলোড করার জন্য কাজ করে

        var flagResult = new viewModel();
        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
        wr.ContentType = "multipart/form-data; boundary=" + boundary;
        wr.Method = method;
        wr.KeepAlive = true;
        wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

        Stream rs = wr.GetRequestStream();


        string path = @filePath;
        System.IO.DirectoryInfo folderInfo = new DirectoryInfo(path);

        foreach (FileInfo file in folderInfo.GetFiles())
        {
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string header = string.Format(headerTemplate, paramName, file, contentType);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);

            FileStream fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            fileStream.Close();
        }

        byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
        rs.Write(trailer, 0, trailer.Length);
        rs.Close();

        WebResponse wresp = null;
        try
        {
            wresp = wr.GetResponse();
            Stream stream2 = wresp.GetResponseStream();
            StreamReader reader2 = new StreamReader(stream2);
            var result = reader2.ReadToEnd();
            var cList = JsonConvert.DeserializeObject<HttpViewModel>(result);
            if (cList.message=="images uploaded!")
            {
                flagResult.success = true;
            }

        }
        catch (Exception ex)
        {
            //log.Error("Error uploading file", ex);
            if (wresp != null)
            {
                wresp.Close();
                wresp = null;
            }
        }
        finally
        {
            wr = null;
        }
        return flagResult;
    }

-1

আমি বুঝতে পারি এটি সম্ভবত সত্যিই দেরি হয়ে গেছে তবে আমি একই সমাধানটির সন্ধান করছি। আমি একটি মাইক্রোসফ্ট প্রতিনিধি থেকে নিম্নলিখিত প্রতিক্রিয়া পেয়েছি

private void UploadFilesToRemoteUrl(string url, string[] files, string logpath, NameValueCollection nvc)
{

    long length = 0;
    string boundary = "----------------------------" +
    DateTime.Now.Ticks.ToString("x");


    HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
    httpWebRequest2.ContentType = "multipart/form-data; boundary=" +
    boundary;
    httpWebRequest2.Method = "POST";
    httpWebRequest2.KeepAlive = true;
    httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;



    Stream memStream = new System.IO.MemoryStream();
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");


    string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

    foreach(string key in nvc.Keys)
    {
        string formitem = string.Format(formdataTemplate, key, nvc[key]);
        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
        memStream.Write(formitembytes, 0, formitembytes.Length);
    }


    memStream.Write(boundarybytes,0,boundarybytes.Length);

    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

    for(int i=0;i<files.Length;i++)
    {

        string header = string.Format(headerTemplate,"file"+i,files[i]);
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
        memStream.Write(headerbytes,0,headerbytes.Length);


        FileStream fileStream = new FileStream(files[i], FileMode.Open,
        FileAccess.Read);
        byte[] buffer = new byte[1024];

        int bytesRead = 0;

        while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
        {
            memStream.Write(buffer, 0, bytesRead);
        }


        memStream.Write(boundarybytes,0,boundarybytes.Length);


        fileStream.Close();
    }

    httpWebRequest2.ContentLength = memStream.Length;
    Stream requestStream = httpWebRequest2.GetRequestStream();

    memStream.Position = 0;
    byte[] tempBuffer = new byte[memStream.Length];
    memStream.Read(tempBuffer,0,tempBuffer.Length);
    memStream.Close();
    requestStream.Write(tempBuffer,0,tempBuffer.Length );
    requestStream.Close();


    WebResponse webResponse2 = httpWebRequest2.GetResponse();

    Stream stream2 = webResponse2.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);

    webResponse2.Close();
    httpWebRequest2 = null;
    webResponse2 = null;

}

7
সুতরাং, ডঃ হিসাবে মূলত একই কোড। মন্দ উপরে? stackoverflow.com/questions/566462/…
ট্র্যাভিস কলিন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.