آپلود فایل های بزرگ با استفاده از پارتیشن بندی در#C
چهارشنبه 15 مهر 1394در این مقاله ارسال فایل های بزرگ به یک سرور در سی شارپ را بررسی میکنیم. در این روش ابتدا فایل مورد نظر را به تکه های کوچک تقسیم میکنیم و پس از ارسال به سرور تکه های کوچک با هم ادغام می شوند.
ارسال فایل بزرگ بر روی سرور می تواند مشکلات بالقوه ای به همرا داشته باشد. هر چند تنظیمات مناسبی در وب کانفیگ داشته باشید ممکن است ارسال فایل به مشکلات مختلفی از جمله 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; }
- C#.net
- 3k بازدید
- 3 تشکر