با سلام در صورتی که یک فایل مثلا با حجم 2 گیگ داشته باشم و در سرور A باشد و برنامه mvc من در سرور B باشد در صورتی که که قصد داشته باشم که این فایل را که در سرور A است دانلود کنم چطور باید عمل کنم ؟
کد زیر عمل نمی کند
private async void down(string url) { Stream stream = null; //This controls how many bytes to read at a time and send to the client int bytesToRead = 10000; // Buffer to read bytes in chunk size specified above byte[] buffer = new Byte[bytesToRead]; // The number of bytes read try { //Create a WebRequest to get the file HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(url); //Create a response for this request HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse(); if (fileReq.ContentLength > 0) fileResp.ContentLength = fileReq.ContentLength; //Get the Stream returned from the response stream = fileResp.GetResponseStream(); // prepare the response to the client. resp is the client Response var resp = _httpContextAccessor.HttpContext.Response; //Indicate the type of data being sent resp.ContentType = "application/octet-stream"; //Name the file resp.Headers.Add("Content-Disposition", "attachment; filename=\"" + "filename.mp4" + "\""); resp.Headers.Add("Content-Length", fileResp.ContentLength.ToString()); int length; do { // Verify that the client is connected. if (HttpContext.RequestAborted.IsCancellationRequested == false) { // Read data into the buffer. length = stream.Read(buffer, 0, bytesToRead); // fileReq.AddRange("byte", length, fileResp.ContentLength); // and write it out to the response's output stream await resp.Body.WriteAsync(buffer, 0, length); // Flush the data resp.Body.Flush(); //Clear the buffer buffer = new Byte[bytesToRead]; } else { // cancel the download if client has disconnected length = -1; } } while (length > 0); //Repeat until no data is read } finally { if (stream != null) { //Close the input stream stream.Close(); } } }
با تشکر
این کد به درد شما نمیخورد. منظور از سرور A و B باید در اینجا مشخص شود. آیا این دو سرور متفاوت با سیستم عامل مختلف هستند، یا این که دو درایو مختلف در یک سرور می باشند، توضیحات و جزئیات بیشتر ارئه بدید تا به شما کمک کنیم.
سلام , اصلا این جوری در نظر بگیریم
این لینک یک ویدئو آموزشی از فردارس است
https://cdn.takhtesefid.org/video1/hq227703514385.mp4
حالا من می خواهم این فایل را از طریق پروژه mvc دانلود کنم
اگر قطعه کد بالا را فراخوانی کنم و این Url را بهش بدهم دانلود را انجام می دهد
مشکل اینجاست که Resume در زمان دانلود True نمی باشد و می خواهم دانلود به حالت (Download file in chunks) باشد .
متشکرم
از این فریم ورک استفاده کنید.
با تشکر از شما
قابلیت Resume در Net Core هم وجود دارد ولی مشکل اینجاست که این فقط با حالتی کار می کند که فایل ها در Wwwroot باشند و یا در یکی از دریاو های سیستم باشند نه حالتی که قرار باشه از یه آدرس دیگه اون را دریافت کنیم . این کتابخانه هم همینطور است . کافی است در زمان Return ، پارامتر آخر که مربوط به Resume می باشد را True کنیم .
public async Task<IActionResult> PlayAsync() { var uploadsRootFolder = Path.Combine(hostingEnvironment.WebRootPath, "uploads\\videos"); var filePath = Path.Combine(uploadsRootFolder, product.FileName); return PhysicalFile(filePath, "application/octet-stream", true); }
مشکل : فایل ما در wwwroot پروژه قرار ندارد که بتوان از این روش استفاده کرد !
؟؟
شما میتوان یک پوشه دیگر ماننده wwwroot داشته باشید، این لینک را بررسی کنید.
اوکی است . مثلا اینه که فایل اصلا چه تو wwwroot و چه پوشه ای دیگر تو سیستم ما نیست ! فایل جای دیگری است که ما فقط آدرس اون را داریم !
مشکل اینجاست
خب اگر مانند همان مثالی که زدید آدرس شما یک cdn باشد تنها کافی است به همان آدرس redirect کنید.
Resume اون جواب نمی دهد و گرنه همه چی درست است ! قبلا از این کد در Mvc 5 استفاده کرده بود و جواب میداد ولی الان فقط قابلیت Resume اون جواب نمی دهد
شما خودتون کافیه یک پروژه MVC بسازید و قطعه کد بالا را با هر نوع Returnی در یک اکشن قرار دهید و خروجی را ببینید !
همان طور هم که گفتم Resume در دات نت Core 2 به بعد هم که اضافه شد مخصوص فایل های است که در wwwroot سیستم یا هر دریاو دیگری قرار داشته باشند . با این حالت که قصد داشته باشیم اطلاعات را تکه تکه از یه آدرس بخوانیم و در هر همان موقع به Response اضافه کنیم Resume جواب نمی دهد !
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)