مرجع تخصصی برنامه نویسان

بزرگترین انجمن برنامه نویسان فارسی زبان

دانلود فایل

چهارشنبه, 26 دی 1397 19:39

دانلود فایل

با سلام در صورتی که یک فایل مثلا با حجم 2 گیگ داشته باشم و در سرور A  باشد و برنامه mvc  من در سرور B باشد در صورتی که که قصد داشته باشم که این فایل را که در سرور A  است دانلود کنم چطور باید عمل کنم ؟ 

Download file in chunks

کد زیر عمل نمی کند 

        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();
                }
            }
        }

با تشکر

پنج شنبه, 27 دی 1397 10:17

این کد به درد شما نمیخورد. منظور از سرور A و B باید در اینجا مشخص شود. آیا این دو سرور متفاوت با سیستم عامل مختلف هستند، یا این که دو درایو مختلف در یک سرور می باشند، توضیحات و جزئیات بیشتر ارئه بدید تا به شما کمک کنیم.

پنج شنبه, 27 دی 1397 13:32

سلام , اصلا این جوری در نظر بگیریم 

این لینک یک ویدئو آموزشی از فردارس است

https://cdn.takhtesefid.org/video1/hq227703514385.mp4

حالا من می خواهم این فایل را  از طریق پروژه mvc دانلود کنم  

اگر قطعه کد بالا را فراخوانی کنم و این Url را بهش بدهم دانلود را انجام می دهد 

مشکل اینجاست که Resume در زمان دانلود True  نمی باشد و می خواهم دانلود به حالت (Download file in chunks) باشد . 

متشکرم 

جمعه, 28 دی 1397 15:19
جمعه, 28 دی 1397 16:57

با تشکر از شما 

قابلیت 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 پروژه قرار ندارد که بتوان از این روش استفاده کرد ! 

؟؟

جمعه, 28 دی 1397 17:12

شما میتوان یک پوشه دیگر ماننده wwwroot داشته باشید، این لینک را بررسی کنید.

جمعه, 28 دی 1397 17:22

اوکی است . مثلا اینه که فایل اصلا چه تو wwwroot و چه پوشه ای دیگر تو سیستم ما نیست ! فایل جای دیگری است که ما فقط آدرس اون را داریم ! 

مشکل اینجاست

جمعه, 28 دی 1397 17:36

خب اگر مانند همان مثالی که زدید آدرس شما یک cdn باشد تنها کافی است به همان آدرس redirect کنید.

جمعه, 28 دی 1397 18:08

Resume اون جواب نمی دهد و گرنه همه چی درست است ! قبلا از این کد در Mvc 5  استفاده کرده بود و جواب میداد ولی الان فقط قابلیت Resume  اون جواب نمی دهد 

شما خودتون کافیه یک پروژه MVC بسازید و قطعه کد بالا را با هر نوع Returnی در یک اکشن قرار دهید و خروجی را ببینید ! 

همان طور هم که گفتم Resume  در دات نت Core 2 به بعد هم که اضافه شد مخصوص فایل های است که در wwwroot سیستم یا هر دریاو دیگری قرار داشته باشند . با این حالت که قصد داشته باشیم اطلاعات را تکه تکه از یه آدرس  بخوانیم و در هر همان موقع به Response  اضافه کنیم Resume  جواب نمی دهد ! 

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید