সি # দিয়ে এইচটিটিপি পোস্টের মাধ্যমে একটি ফাইল প্রেরণ করুন


97

আমি প্রায় অনুসন্ধান এবং পড়া ছিল এবং সত্যিই দরকারী কিছু জরিমানা করতে পারেন।

আমি একটি ছোট সি # উইন অ্যাপ লিখছি যা ব্যবহারকারীকে কোনও ওয়েব সার্ভারে এফটিপি দ্বারা নয়, পিএসটি ব্যবহার করে এইচটিটিপি দিয়ে ফাইল পাঠাতে দেয় allows এটি ওয়েব ফর্মের মতো মনে হলেও উইন্ডোজ অ্যাপ্লিকেশনটিতে চলছে।

আমি এই জাতীয় কিছু ব্যবহার করে আমার এইচটিটিপিওব্রেকয়েস্ট অবজেক্ট তৈরি করেছি

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest 

এবং এছাড়াও Method, ContentTypeএবং ContentLengthবৈশিষ্ট্য সেট । তবে আমি যেতে পারি।

এটি আমার কোডের টুকরো:

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;
req.KeepAlive = false;
req.Method = "POST";
req.Credentials = new NetworkCredential(user.UserName, user.UserPassword);
req.PreAuthenticate = true;
req.ContentType = file.ContentType;
req.ContentLength = file.Length;
HttpWebResponse response = null;

try
{
    response = req.GetResponse() as HttpWebResponse;
}
catch (Exception e) 
{
}

সুতরাং আমার প্রশ্নটি মূলত আমি কীভাবে এইচটিটিপি পোস্টের মাধ্যমে সি # দিয়ে একটি ফাই (পাঠ্য ফাইল, চিত্র, অডিও ইত্যাদি) প্রেরণ করতে পারি?

ধন্যবাদ!


উত্তর:


113

.NET 4.5 (বা .NET 4.0 ব্যবহার করে মাইক্রোসফট.নোট.এইচটিপি প্যাকেজ যোগ করে নুগেট) ফর্ম অনুরোধগুলির অনুকরণ করার জন্য আরও সহজ উপায় রয়েছে। এখানে একটি উদাহরণ:

private async Task<System.IO.Stream> Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes)
{
    HttpContent stringContent = new StringContent(paramString);
    HttpContent fileStreamContent = new StreamContent(paramFileStream);
    HttpContent bytesContent = new ByteArrayContent(paramFileBytes);
    using (var client = new HttpClient())
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(stringContent, "param1", "param1");
        formData.Add(fileStreamContent, "file1", "file1");
        formData.Add(bytesContent, "file2", "file2");
        var response = await client.PostAsync(actionUrl, formData);
        if (!response.IsSuccessStatusCode)
        {
            return null;
        }
        return await response.Content.ReadAsStreamAsync();
    }
}

8
যদি সম্ভব হয় তবে এই পদ্ধতিটি কল করার একটি সহজ উদাহরণ দেখাতে পারে?
জ্যাকব্র365

10
কি প্যারামস্ট্রিং পরামিতি?
ইরান ওটজাপ

4
ধন্যবাদ, খুব বিস্তৃত উদাহরণ! @ ইরানোটজাপ প্যারামস্ট্রিং হ'ল পরমটির আসল মান । তৃতীয় যুক্তি form.Addহল ঐচ্ছিক এবং ফাইল কেবল দরকারী।
স্টকব্রেক

4
@ লিয়াম, আমি সম্পূর্ণরূপে একমত জিনিসগুলি সহজ রাখতে আমার 2013 উত্তর থেকে অ্যাসিঙ্ক কোডটি সরানো হয়েছিল। এ্যাসিঙ্ক পদ্ধতিতে এটিকে আবার পরিবর্তন করা আমার টোডো তালিকায় রয়েছে কারণ বেশিরভাগ সি # বিকাশকারীদের এই সময়ে এটিতে স্বাচ্ছন্দ্য বোধ করা উচিত।
জোশকড

4
@ আম্মার, আমি যে সম্পর্কে সচেতন তা নয়, আমি মনে করি আপনাকে ফাইলটি একটি স্ট্রিম বা বাইটে পড়তে হবে [] এবং যথাক্রমে স্ট্রিমকন্টেন্ট বা বাইটআরাই কনটেন্ট ব্যবহার করতে হবে।
জোশকোডস

52

কেবল কাঁচা ফাইলটি প্রেরণ করতে :

using(WebClient client = new WebClient()) {
    client.UploadFile(address, filePath);
}

আপনি যদি একটি দিয়ে একটি ব্রাউজার ফর্ম অনুকরণ করতে চান <input type="file"/>, তবে এটি আরও শক্ত। একাধিক / ফর্ম-ডেটা উত্তরের জন্য এই উত্তরটি দেখুন ।


(আপনি অবশ্যই শিরোনাম / শংসাপত্রগুলি ইত্যাদি স্বাভাবিক হিসাবে যোগ করতে পারেন)
মার্ক গ্রাভেল

4
ধন্যবাদ, আমি এটিকে কিছু সাধারণ ব্যবহার করেছি এবং আমি কাজ করি না। এখন, আপনি যেমনটি বলছেন, আমার ব্রাউজারের ইনপুট ফাইলটি অনুকরণ করা দরকার, এরকম কিছু << ইনপুট টাইপ = "ফাইল" নাম "ব্যবহারকারীর ফাইল" />।
গবিটোজু

4
আমি উপরের কোডটি ব্যবহার করেছি এবং ত্রুটি পেয়েছি যেমন: আর্গুমেন্ট ব্যতিক্রমটি ইউজার কোড দ্বারা অযথিত ছিল: U ​​"ইউআরআই ফর্ম্যাটগুলি সমর্থিত নয়" "}} কিভাবে আমি এটি করতে পারব? অকার্যকর পেজ_ল্ড (অবজেক্ট প্রেরক, ইভেন্টআর্গস ই) {স্ট্রিং ঠিকানা = "HTTP: www.testproject.com/SavedFiles"; স্ট্রিং ফাইলপথ = @ "ডি: \ টেস্ট \ ফাইলঅপেশন \ টেস্টফিল.টেক্সট"; (ওয়েবক্লিয়েন্ট ক্লায়েন্ট = নতুন ওয়েবক্লিয়েন্ট ()) {ক্লায়েন্ট.উপলোড ফাইল (ঠিকানা, ফাইলপথ) ব্যবহার করে; }}
সুধা

4
@ সুধা আপনি একটি সত্যিকারের ওয়েব ঠিকানা ব্যবহার করার চেষ্টা করেছেন? http://www.testproject.com/SavedFiles- নোট করুন//
মার্ক গ্রাভেল

8

আমার জন্য client.UploadFileএখনও একটি মাল্টিপার্ট অনুরোধে সামগ্রীটি মোড়ানো হয়েছে তাই আমাকে এটি এইভাবে করতে হয়েছিল:

using (WebClient client = new WebClient())
{
    client.Headers.Add("Content-Type", "application/octet-stream");
    using (Stream fileStream = File.OpenRead(filePath))
    using (Stream requestStream = client.OpenWrite(new Uri(fileUploadUrl), "POST"))
    {
        fileStream.CopyTo(requestStream);
    }
}

5

আমি একই সমস্যা পেয়েছি এবং নিম্নলিখিত কোডগুলি এই সমস্যার সঠিক উত্তর দিয়েছে:

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

//Creation and specification of the request
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); //sVal is id for the webService
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Method = "POST";
wr.KeepAlive = true;
wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

string sAuthorization = "login:password";//AUTHENTIFICATION BEGIN
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(sAuthorization);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
wr.Headers.Add("Authorization: Basic " + returnValue); //AUTHENTIFICATION END
Stream rs = wr.GetRequestStream();


string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; //For the POST's format

//Writting of the file
rs.Write(boundarybytes, 0, boundarybytes.Length);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(Server.MapPath("questions.pdf"));
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, "file", "questions.pdf", contentType);
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);

FileStream fileStream = new FileStream(Server.MapPath("questions.pdf"), 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();
rs = null;

WebResponse wresp = null;
try
{
    //Get the response
    wresp = wr.GetResponse();
    Stream stream2 = wresp.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);
    string responseData = reader2.ReadToEnd();
}
catch (Exception ex)
{
    string s = ex.Message;
}
finally
{
    if (wresp != null)
    {
        wresp.Close();
        wresp = null;
    }
    wr = null;
}

আপনি কীভাবে ডেটা পাবেন এবং অন্য প্রান্তে ফাইলটি ডিস্কে সংরক্ষণ করবেন?
কুমারহর্শ

3

আপনার ফাইলটি অনুরোধের স্ট্রিমে লিখতে হবে:

using (var reqStream = req.GetRequestStream()) 
{    
    reqStream.Write( ... ) // write the bytes of the file
}

1

বাইট অ্যারে থেকে ফাইলগুলি পোস্ট করতে:

private static string UploadFilesToRemoteUrl(string url, IList<byte[]> files, NameValueCollection nvc) {

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

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

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

        foreach (string key in nvc.Keys) {
            var formitem = string.Format(formdataTemplate, key, nvc[key]);
            var formitembytes = Encoding.UTF8.GetBytes(formitem);
            postQueue.Write(formitembytes);
        }

        var headerTemplate = "\r\n--" + boundary + "\r\n" +
            "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + 
            "Content-Type: application/zip\r\n\r\n";

        var i = 0;
        foreach (var file in files) {
            var header = string.Format(headerTemplate, "file" + i, "file" + i + ".zip");
            var headerbytes = Encoding.UTF8.GetBytes(header);
            postQueue.Write(headerbytes);
            postQueue.Write(file);
            i++;
        }

        postQueue.Write(Encoding.UTF8.GetBytes("\r\n--" + boundary + "--"));

        request.ContentLength = postQueue.Length;

        using (var requestStream = request.GetRequestStream()) {
            postQueue.CopyToStream(requestStream);
            requestStream.Close();
        }

        var webResponse2 = request.GetResponse();

        using (var stream2 = webResponse2.GetResponseStream())
        using (var reader2 = new StreamReader(stream2)) {

            var res =  reader2.ReadToEnd();
            webResponse2.Close();
            return res;
        }
    }

public class ByteArrayCustomQueue {

    private LinkedList<byte[]> arrays = new LinkedList<byte[]>();

    /// <summary>
    /// Writes the specified data.
    /// </summary>
    /// <param name="data">The data.</param>
    public void Write(byte[] data) {
        arrays.AddLast(data);
    }

    /// <summary>
    /// Gets the length.
    /// </summary>
    /// <value>
    /// The length.
    /// </value>
    public int Length { get { return arrays.Sum(x => x.Length); } }

    /// <summary>
    /// Copies to stream.
    /// </summary>
    /// <param name="requestStream">The request stream.</param>
    /// <exception cref="System.NotImplementedException"></exception>
    public void CopyToStream(Stream requestStream) {
        foreach (var array in arrays) {
            requestStream.Write(array, 0, array.Length);
        }
    }
}

1
     public string SendFile(string filePath)
            {
                WebResponse response = null;
                try
                {
                    string sWebAddress = "Https://www.address.com";

                    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(sWebAddress);
                    wr.ContentType = "multipart/form-data; boundary=" + boundary;
                    wr.Method = "POST";
                    wr.KeepAlive = true;
                    wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
                    Stream stream = wr.GetRequestStream();
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";

                    stream.Write(boundarybytes, 0, boundarybytes.Length);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(filePath);
                    stream.Write(formitembytes, 0, formitembytes.Length);
                    stream.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, "file", Path.GetFileName(filePath), Path.GetExtension(filePath));
                    byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                    stream.Write(headerbytes, 0, headerbytes.Length);

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

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

                    response = wr.GetResponse();
                    Stream responseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(responseStream);
                    string responseData = streamReader.ReadToEnd();
                    return responseData;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                finally
                {
                    if (response != null)
                        response.Close();
                }
            }

0

.NET 4.5 ব্যবহার করে ফর্ম পোষ্ট ফাইল আপলোড করার চেষ্টা করছে। উপরের বেশিরভাগ পদ্ধতির চেষ্টা করেও কোনও ফল লাভ হয়নি। সমাধানটি এখানে পেয়েছে https://www.c-sharpcorner.com/article/upload-any-file- using-http-post-multpart-form- data

তবে আমি কেন আগ্রহী নই কারণ কেন আমরা এখনও এই সাধারণ ব্যবহারগুলিতে আমাদের নিম্ন স্তরের প্রোগ্রামিংয়ের মোকাবিলা করতে হবে (কাঠামোর মাধ্যমে সুন্দরভাবে পরিচালনা করা উচিত)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.