آپلود فایل های بزرگ با استفاده از پارتیشن بندی در#C

چهارشنبه 15 مهر 1394

در این مقاله ارسال فایل های بزرگ به یک سرور در سی شارپ را بررسی میکنیم. در این روش ابتدا فایل مورد نظر را به تکه های کوچک تقسیم میکنیم و پس از ارسال به سرور تکه های کوچک با هم ادغام می شوند.

آپلود فایل های بزرگ با استفاده از پارتیشن بندی در#C

ارسال فایل بزرگ بر روی سرور  می تواند مشکلات بالقوه ای به همرا داشته باشد. هر چند تنظیمات مناسبی در وب کانفیگ داشته باشید ممکن است ارسال فایل به مشکلات مختلفی از جمله  time out برخورد کند در این مقاله روش مناسبی را بررسی میکنیم.

کد شامل دو بخش است تقسیم فایل اولیه و دوم ادغام نهایی تکه ها به فایل اصلی.

مفهوم تقسیم یک فایل بسیار اساسی است. در مثال یک تکه کد بااندازه 128B تنظیم شده است. برای نشان دادن فایل باید از  3 تکه 128B و یک تکه 32B تقسیم شود.

برای این مثال در سی شارپ  یک کلاس با نام Utils که در ان اندازه فایل،نام فایل،محل پوشه موقت و حداکثر اندازه فایل مشخص می شود.تقسیم فایل با استفاده از متد SplitFile صورت میگیرد.

Utils ut = new Utils();
ut.FileName = "hs-2004-15-b-full_tif.bmp"; // hard coded for demo
ut.TempFolder = Path.Combine(CurrentFolder, "Temp");
ut.MaxFileSizeMB = 1;
ut.SplitFile();

foreach (string File in ut.FileParts)
  {
    UploadFile(File);
  }
MessageBox.Show("Upload complete!");

کد زیر را مینویسیم

public bool UploadFile(string FileName)
{
  bool rslt = false;
  using (var client = new HttpClient())
    {
      using (var content = new MultipartFormDataContent())
        {
         var fileContent = new   ByteArrayContent(System.IO.File.ReadAllBytes(FileName));
         fileContent.Headers.ContentDisposition = new
             ContentDispositionHeaderValue("attachment")
               {
                FileName = Path.GetFileName(FileName)
               };
         content.Add(fileContent);

        var requestUri = "http://localhost:8170/Home/UploadFile/";
            try
            {
                var result = client.PostAsync(requestUri, content).Result;
                rslt = true;
            }
            catch (Exception ex)
            {
                // log error
                rslt = false;
            }
        }
    }
   return rslt;
}

متد زیر فایل را تقسیم می کند.

public bool SplitFile()
{
    bool rslt = false;
    string BaseFileName = Path.GetFileName(FileName);
    // set the size of file chunk we are going to split into
    int BufferChunkSize = MaxFileSizeMB * (1024 * 1024);
    // set a buffer size and an array to store the buffer data as we read it
    const int READBUFFER_SIZE = 1024;
    byte[] FSBuffer = new byte[READBUFFER_SIZE];
    // open the file to read it into chunks
    using (FileStream FS = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        // calculate the number of files that will be created
        int TotalFileParts = 0;
        if (FS.Length < BufferChunkSize)
        {
            TotalFileParts = 1;
        }
        else
        {
            float PreciseFileParts = ((float)FS.Length / (float)BufferChunkSize);
            TotalFileParts = (int)Math.Ceiling(PreciseFileParts);
        }

        int FilePartCount = 0;
        // scan through the file, and each time we get enough data to fill a chunk, write out that file
        while (FS.Position < FS.Length)
        {
            string FilePartName = String.Format("{0}.part_{1}.{2}",
            BaseFileName, (FilePartCount + 1).ToString(), TotalFileParts.ToString());
            FilePartName = Path.Combine(TempFolder, FilePartName);
            FileParts.Add(FilePartName);
            using (FileStream FilePart = new FileStream(FilePartName, FileMode.Create))
            {
                int bytesRemaining = BufferChunkSize;
                int bytesRead = 0;
                while (bytesRemaining > 0 && (bytesRead = FS.Read(FSBuffer, 0,
                 Math.Min(bytesRemaining, READBUFFER_SIZE))) > 0)
                {
                    FilePart.Write(FSBuffer, 0, bytesRead);
                    bytesRemaining -= bytesRead;
                }
            }
          // file written, loop for next chunk
          FilePartCount++;
        }

    }
        return rslt;
}

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید