কিভাবে একটি ফাইল পোস্ট গ্রহণ করবেন cept


254

বিশ্রাম পরিষেবাটি তৈরি করতে আমি asp.net এমভিসি 4 ওয়েবপি বিটা ব্যবহার করছি। আমার ক্লায়েন্ট অ্যাপ্লিকেশনগুলি থেকে পোস্ট করা চিত্র / ফাইলগুলি গ্রহণ করতে সক্ষম হওয়া দরকার। ওয়েবপি ব্যবহার করে এটি কি সম্ভব? নীচে আমি বর্তমানে যে ক্রিয়াটি ব্যবহার করছি তা নীচে দেওয়া হল। এটি কীভাবে কাজ করা উচিত তা উদাহরণস্বরূপ কেউ জানেন?

[HttpPost]
public string ProfileImagePost(HttpPostedFile profileImage)
{
    string[] extensions = { ".jpg", ".jpeg", ".gif", ".bmp", ".png" };
    if (!extensions.Any(x => x.Equals(Path.GetExtension(profileImage.FileName.ToLower()), StringComparison.OrdinalIgnoreCase)))
    {
        throw new HttpResponseException("Invalid file type.", HttpStatusCode.BadRequest);
    }

    // Other code goes here

    return "/path/to/image.png";
}

3
এটি কেবল এমভিসির সাথে কাজ করে যা ওয়েবএপিআই কাঠামো নয়।
ফিল

আপনি কেবল Request.Files
তেজস

7
ApiController এ এইচটিটিপিআরকুয়েস্টবেজ থাকে না যা ফাইল সম্পত্তি আছে। এটি রিকোয়েস্ট অবজেক্টটি এইচটিটিপিআরকুয়েস্টম্যাসেজ ক্লাসের ভিত্তিতে তৈরি।
ফিল

উত্তর:


168

দেখুন http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multpart-mime#m Multipartmime , যদিও আমি মনে করি নিবন্ধটি এটিকে কিছুটা জটিল বলে মনে হচ্ছে এটা সত্যিই হয়.

মূলত,

public Task<HttpResponseMessage> PostFile() 
{ 
    HttpRequestMessage request = this.Request; 
    if (!request.Content.IsMimeMultipartContent()) 
    { 
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    } 

    string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads"); 
    var provider = new MultipartFormDataStreamProvider(root); 

    var task = request.Content.ReadAsMultipartAsync(provider). 
        ContinueWith<HttpResponseMessage>(o => 
    { 

        string file1 = provider.BodyPartFileNames.First().Value;
        // this is the file name on the server where the file was saved 

        return new HttpResponseMessage() 
        { 
            Content = new StringContent("File uploaded.") 
        }; 
    } 
    ); 
    return task; 
} 

5
একটি মাত্র ফাইল পড়তে একটি টাস্ক ব্যবহার করে কী লাভ? আসল প্রশ্ন, আমি এখনই টাস্কগুলি ব্যবহার শুরু করছি। আমার বর্তমান বোঝাপড়া থেকে, একাধিক ফাইল সঠিক আপলোড করার সময় এই কোডটি সত্যই উপযুক্ত?
ক্রিস

48
মাল্টিপার্টফর্মডাটাস্ট্রিমপ্রোভাইডারটির বডি পার্টফিলনেমসের আর কোনও সম্পত্তি নেই (ওয়েবএপিপি আরটিএম-এ)। দেখুন asp.net/web-api/overview/working-with-http/...
শ্রাইক্

5
ছেলেরা, আপনারা কেউ দয়া করে এইচটিটিপি কনটেক্সট.কন্টেন.আরকুয়েস্ট.ফায়ালস ব্যবহার করে ফাইলগুলিতে অ্যাক্সেস করতে পারছেন না কেন এবং তার পরিবর্তে এই অভিনব মাল্টিপার্টফর্মডাটা স্ট্রিমপ্রাইডারটি ব্যবহার করার দরকার আছে কিনা তা সম্পর্কে দয়া করে কিছু আলোকপাত করতে পারেন? সম্পূর্ণ প্রশ্ন: স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 17967544
নিহার

7
ফাইলগুলি বডি পার্ট_8 বি 77040 বি -354 বি-464 সি-বিসি 15-বি 3591f98f30f হিসাবে সংরক্ষণ করা হচ্ছে । এগুলি যেমন ক্লায়েন্টের মতো ছিল ঠিক তেমনই pic.jpg এর মতো সংরক্ষণ করা উচিত নয় ?
এলব্রাহিম

10
MultipartFormDataStreamProviderBodyPartFileNamesসম্পত্তি আর প্রকাশ করা হবে না , আমি FileData.First().LocalFileNameপরিবর্তে ব্যবহার ।
চটিউই মালেক

374

আমি অবাক হয়েছি যে আপনারা অনেকে সার্ভারে ফাইল সংরক্ষণ করতে চান বলে মনে হচ্ছে। মেমরিতে সমস্ত কিছু রাখার সমাধান নীচে রয়েছে:

[HttpPost("api/upload")]
public async Task<IHttpActionResult> Upload()
{
    if (!Request.Content.IsMimeMultipartContent())
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);
    foreach (var file in provider.Contents)
    {
        var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
        var buffer = await file.ReadAsByteArrayAsync();
        //Do whatever you want with filename and its binary data.
    }

    return Ok();
}

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

21
@ ডাব্লু.মিন্টস আমি ডেটা সঞ্চয় করতে চাওয়ার কারণগুলি বুঝতে পেরেছি, তবে কেন সার্ভার ডিস্কের জায়গাতে কেউ আপলোড করা ডেটা সঞ্চয় করতে চাইবে তা আমি বুঝতে পারি না। এমনকি ছোট প্রকল্পের জন্য - আপনার সর্বদা ওয়েব-সার্ভার থেকে ফাইল স্টোরেজ বিচ্ছিন্ন রাখা উচিত।
গ্লেনো

1
আপনার পোস্ট করা ফাইলের আকার 64k এর চেয়ে কম কিনা তা নিশ্চিত করুন, অন্যথায় অনুরোধগুলি অগ্রাহ্য করার জন্য ডিফল্ট আচরণ হ'ল আমি লগ সময়ের জন্য এটিতে আটকে ছিলাম।
গ্যারি ডেভিস 12

3
দুর্ভাগ্যক্রমে, মাল্টি-পার্টমেমোরি স্ট্রিমপ্রাইডার ফর্ম ডেটা পাশাপাশি পড়তে চাইলে সহায়তা করে না। মাল্টিপার্টফর্মডাটা ডেটা মেমরি স্ট্রিমপ্রাইডার এর মতো কিছু তৈরি করতে চেয়েছিল তবে এ্যাসনেটব্লস্টে অনেক ক্লাস এবং সহায়ক সহায়ক শ্রেণি অভ্যন্তরীণ রয়েছে :(
মার্টিনাস

9
File.WriteAllBytes(filename, buffer);এটিকে কোনও ফাইলে লিখতে হবে
পোমারটি

118

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

public HttpResponseMessage Post()
{
    var httpRequest = HttpContext.Current.Request;
    if (httpRequest.Files.Count < 1)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

    foreach(string file in httpRequest.Files)
    {
        var postedFile = httpRequest.Files[file];
        var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName);
        postedFile.SaveAs(filePath);
        // NOTE: To store in memory use postedFile.InputStream
    }

    return Request.CreateResponse(HttpStatusCode.Created);
}

26
ওয়েবপিআই ওউইন হোস্ট করা হয় যা একটি স্ব হোস্টিং ধারক H
জাচ

1
এটি এর মতো স্থির করে: var httpRequest = System.Web.HttpContext.Current.Request;
msysmilu

7
আপনি সম্পূর্ণরূপে না করে থাকলে WebAPI তে System.Web ব্যবহার করবেন না।
কুগেল

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

2
দুর্দান্ত উত্তর। একটি মাত্র বিশদ: আপনি যদি কোনও এইচটিএমএল পৃষ্ঠা থেকে আপলোড করছেন তবে <ইনপুট টাইপ = "ফাইল" /> ট্যাগটিতে অবশ্যই একটি "নাম" বৈশিষ্ট্য থাকতে হবে, বা ফাইলটি এইচটিটিপি কনটেক্সট.কন্ট্রেন.আরকিস্ট.ফাইলে উপস্থিত হবে না।
জিবিইউ

17

এএসপি.এনইটি কোর উপায় এখন এখানে :

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    // full path to file in temp location
    var filePath = Path.GetTempFileName();

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    // process uploaded files
    // Don't rely on or trust the FileName property without validation.

    return Ok(new { count = files.Count, size, filePath});
}

16

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

ওয়েব এপিআই পদ্ধতি:

[Route("api/myfileupload")]        
[HttpPost]
public string MyFileUpload()
{
    var request = HttpContext.Current.Request;
    var filePath = "C:\\temp\\" + request.Headers["filename"];
    using (var fs = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
    {
        request.InputStream.CopyTo(fs);
    }
    return "uploaded";
}

এইচটিএমএল ফাইল আপলোড:

<form>
    <input type="file" id="myfile"/>  
    <input type="button" onclick="uploadFile();" value="Upload" />
</form>
<script type="text/javascript">
    function uploadFile() {        
        var xhr = new XMLHttpRequest();                 
        var file = document.getElementById('myfile').files[0];
        xhr.open("POST", "api/myfileupload");
        xhr.setRequestHeader("filename", file.name);
        xhr.send(file);
    }
</script>

যদিও এটি 'সাধারণ' মাল্টিপার্ট ফর্ম আপলোডগুলির সাথে কাজ করবে না তবে সাবধান হন।
টম

3
@ টম এর মানে কী?
চজত3

এর অর্থ এটি ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ নয় যেখানে জাভাস্ক্রিপ্ট অক্ষম / অ-অস্তিত্বহীন, যেমন নেটস্কেপ ১। *
মিকেল দেই বলিদার

13

আমি আমার ওয়েবাপি এমভিসি 4 প্রকল্পের সমস্ত নুগেটগুলি আপডেট করার আগে আমি মাইক ওয়াসনের উত্তরটি ব্যবহার করেছি। একবার আমি করার পরে, আমাকে ফাইল আপলোড ক্রিয়াটি আবার লিখতে হয়েছিল:

    public Task<HttpResponseMessage> Upload(int id)
    {
        HttpRequestMessage request = this.Request;
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType));
        }

        string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads");
        var provider = new MultipartFormDataStreamProvider(root);

        var task = request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(o =>
            {
                FileInfo finfo = new FileInfo(provider.FileData.First().LocalFileName);

                string guid = Guid.NewGuid().ToString();

                File.Move(finfo.FullName, Path.Combine(root, guid + "_" + provider.FileData.First().Headers.ContentDisposition.FileName.Replace("\"", "")));

                return new HttpResponseMessage()
                {
                    Content = new StringContent("File uploaded.")
                };
            }
        );
        return task;
    }

দৃশ্যত বডি পার্টফাইনেমগুলি মাল্টিপার্টফর্মডাটাস্ট্রিমপ্রোভাইডার এর মধ্যে আর উপলভ্য নয়।


ওয়েবএপিপি আরটিএম-তে বডি পার্টফাইনেমগুলি ফাইলডাটাতে পরিবর্তন করা হয়েছে। AP.net/web-api/overview/working-with-http/…
মার্ক ভ্যান

কেন কেবলমাত্র System.Web.HttpContext.Current.Request.Files সংগ্রহ ব্যবহার করবেন না?
এডোকনেকশনটি

আমি 2 টি রিজার্ভেশন সহ আপনার পদ্ধতিটি ব্যবহার করার কথা ভাবছি: 1) এটি কি দুইবার লেখা হয় না: i) ইন ReadAsMultipartAsyncএবং ii) ইন File.Move? 2) আপনি করতে পারেন async File.Move?
বিস্কুট

1) দুটি লেখার সাথে আমার সমস্যা নেই, ইউআরএলটি কি দুবার ডাকা হচ্ছে? 2) আপনি Task.Run (() => {File.Move (src, dest);}) করতে পারেন;
স্টিভ স্টোকস

10

এই একই দিকের দিকে, আমি একটি ক্লায়েন্ট এবং সার্ভার স্নিপেট পোস্ট করছি যা ওয়েবএপি ব্যবহার করে এক্সেল ফাইলগুলি পাঠায়, সি # 4:

public static void SetFile(String serviceUrl, byte[] fileArray, String fileName)
{
    try
    {
        using (var client = new HttpClient())
        {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                using (var content = new MultipartFormDataContent())
                {
                    var fileContent = new ByteArrayContent(fileArray);//(System.IO.File.ReadAllBytes(fileName));
                    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = fileName
                    };
                    content.Add(fileContent);
                    var result = client.PostAsync(serviceUrl, content).Result;
                }
        }
    }
    catch (Exception e)
    {
        //Log the exception
    }
}

এবং সার্ভার ওয়েবপিআই নিয়ামক:

public Task<IEnumerable<string>> Post()
{
    if (Request.Content.IsMimeMultipartContent())
    {
        string fullPath = HttpContext.Current.Server.MapPath("~/uploads");
        MyMultipartFormDataStreamProvider streamProvider = new MyMultipartFormDataStreamProvider(fullPath);
        var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
                    throw new HttpResponseException(HttpStatusCode.InternalServerError);

            var fileInfo = streamProvider.FileData.Select(i =>
            {
                var info = new FileInfo(i.LocalFileName);
                return "File uploaded as " + info.FullName + " (" + info.Length + ")";
            });
            return fileInfo;

        });
        return task;
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Invalid Request!"));
    }
}

এবং কাস্টম মাইমল্টিপার্টফর্মডাটা স্ট্রিমপ্রাইডার, ফাইলের নামটি কাস্টমাইজ করার দরকার:

পিএস: আমি এই কোডটি অন্য পোস্ট থেকে নিয়েছি http://www.codeguru.com/csharp/.net/uploading-files-asynchronously- using-asp.net-web-api .htm

public class MyMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public MyMultipartFormDataStreamProvider(string path)
        : base(path)
    {

    }

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
    {
        string fileName;
        if (!string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName))
        {
            fileName = headers.ContentDisposition.FileName;
        }
        else
        {
            fileName = Guid.NewGuid().ToString() + ".data";
        }
        return fileName.Replace("\"", string.Empty);
    }
}

আপনি কীভাবে আপনাকে static method SetFileনিজের কন্ট্রোলারে কল করতে পারেন তা দেখাতে পারেন ?

এটি একটি ভাল উত্তর। এর মতো বেস সরবরাহকারীর প্রসারিত করা আপনাকে স্ট্রিমটি নিয়ন্ত্রণ করতে সক্ষম করে এবং কেবল pathমেঘ স্টোরেজ সরবরাহের চেয়ে আরও নমনীয়তা দেয় ।
ফিল কুপার

6
[HttpPost]
public JsonResult PostImage(HttpPostedFileBase file)
{
    try
    {
        if (file != null && file.ContentLength > 0 && file.ContentLength<=10485760)
        {
            var fileName = Path.GetFileName(file.FileName);                                        

            var path = Path.Combine(Server.MapPath("~/") + "HisloImages" + "\\", fileName);

            file.SaveAs(path);
            #region MyRegion
            ////save imag in Db
            //using (MemoryStream ms = new MemoryStream())
            //{
            //    file.InputStream.CopyTo(ms);
            //    byte[] array = ms.GetBuffer();
            //} 
            #endregion
            return Json(JsonResponseFactory.SuccessResponse("Status:0 ,Message: OK"), JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(JsonResponseFactory.ErrorResponse("Status:1 , Message: Upload Again and File Size Should be Less Than 10MB"), JsonRequestBehavior.AllowGet);
        }
    }
    catch (Exception ex)
    {

        return Json(JsonResponseFactory.ErrorResponse(ex.Message), JsonRequestBehavior.AllowGet);

    }
}

6
আমি মনে করি ব্যবহারকারীর কিছু ব্যাখ্যা দরকার ...!
কামেশ

4

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

private async Task<Stream> ReadStream()
{
    Stream stream = null;
    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);
    foreach (var file in provider.Contents)
    {
        var buffer = await file.ReadAsByteArrayAsync();
        stream = new MemoryStream(buffer);
    }

    return stream;
}

private async Task<Stream> ReadLargeStream()
{
    Stream stream = null;
    string root = Path.GetTempPath();
    var provider = new MultipartFormDataStreamProvider(root);
    await Request.Content.ReadAsMultipartAsync(provider);
    foreach (var file in provider.FileData)
    {
        var path = file.LocalFileName;
        byte[] content = File.ReadAllBytes(path);
        File.Delete(path);
        stream = new MemoryStream(content);
    }

    return stream;
}

1

আমার পূর্বরূপ ওয়েব API এর জন্য একই সমস্যা ছিল। অংশটি এখনও নতুন এমভিসি 4 ওয়েব এপিআইতে পোর্ট করেনি, তবে সম্ভবত এটি সহায়তা করে:

এইচটিটিপিআরকুয়েস্টমেসেজ বা স্ট্রিমের সাথে পুনরায় ফাইল আপলোড করবেন?

দয়া করে আমাকে জানান, আগামীকাল বসে আবার এটি প্রয়োগ করার চেষ্টা করতে পারেন।


1

নেট কোরের জন্যও এই প্রশ্নের অনেকগুলি ভাল উত্তর রয়েছে। প্রদত্ত কোডের নমুনাগুলি ঠিকঠাক কাজ করে আমি উভয় ফ্রেমওয়ার্ক ব্যবহার করছিলাম। সুতরাং আমি এটি পুনরাবৃত্তি করব না। আমার ক্ষেত্রে গুরুত্বপূর্ণ বিষয়টি ছিল swagger এর সাথে ফাইল আপলোড ক্রিয়াগুলি কীভাবে ব্যবহার করা যায় :

সোয়াগারে ফাইল আপলোড বোতাম

এখানে আমার পুনরুদ্ধার:

এএসপি। নেট ওয়েবএপিআই 2

.NET কোর


1

API কন্ট্রোলার:

[HttpPost]
public HttpResponseMessage Post()
{
    var httpRequest = System.Web.HttpContext.Current.Request;

    if (System.Web.HttpContext.Current.Request.Files.Count < 1)
    {
        //TODO
    }
    else
    {

    try
    { 
        foreach (string file in httpRequest.Files)
        { 
            var postedFile = httpRequest.Files[file];
            BinaryReader binReader = new BinaryReader(postedFile.InputStream);
            byte[] byteArray = binReader.ReadBytes(postedFile.ContentLength);

        }

    }
    catch (System.Exception e)
    {
        //TODO
    }

    return Request.CreateResponse(HttpStatusCode.Created);
}

0

ম্যাট ফ্রেয়ারের উত্তরটি পরিপূরক করা - এটি ডিস্ক থেকে সংরক্ষণ না করে এবং স্ট্রিম থেকে সরাসরি ফাইলটি পড়ার জন্য এটিএসপি নেট কোর বিকল্প হবে:

public ActionResult OnPostUpload(List<IFormFile> files)
    {
        try
        {
            var file = files.FirstOrDefault();
            var inputstream = file.OpenReadStream();

            XSSFWorkbook workbook = new XSSFWorkbook(stream);

            var FIRST_ROW_NUMBER = {{firstRowWithValue}};

            ISheet sheet = workbook.GetSheetAt(0);
            // Example: var firstCellRow = (int)sheet.GetRow(0).GetCell(0).NumericCellValue;

            for (int rowIdx = 2; rowIdx <= sheet.LastRowNum; rowIdx++)
               {
                  IRow currentRow = sheet.GetRow(rowIdx);

                  if (currentRow == null || currentRow.Cells == null || currentRow.Cells.Count() < FIRST_ROW_NUMBER) break;

                  var df = new DataFormatter();                

                  for (int cellNumber = {{firstCellWithValue}}; cellNumber < {{lastCellWithValue}}; cellNumber++)
                      {
                         //business logic & saving data to DB                        
                      }               
                }
        }
        catch(Exception ex)
        {
            throw new FileFormatException($"Error on file processing - {ex.Message}");
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.