Загрузка файла из Web API по нажатию кнопки не работает - PullRequest
0 голосов
/ 08 декабря 2018

Я новичок в веб-API, я создал веб-API, он содержит методы, которые загружают файлы.Когда я запрашиваю мой API из веб-браузера для загрузки любого файла, он загружает файл, но я не знаю, как это будет работать при нажатии кнопки.Я не понимаю, в чем я не прав, ниже приведен мой код.

Метод загрузки в API

[HttpGet]
    public HttpResponseMessage DownloadContent(int? contentId, int? learnerId)
    {
        var classMethodName = this.GetType().Name + "|" + System.Reflection.MethodBase.GetCurrentMethod().Name;
        //var uniqueId = Guid.NewGuid().ToString();
        newLog.append(uniqueId, classMethodName, 75);
        //HttpResponseMessage response;/

        // string rootPath = "";
        try
        {

            // for download command get path of the file
            if (contentId != null && contentId.Value > 0)
            {
                if (learnerId == null && learnerId.Value <= 0) throw new Exception(Constants.learnerId_Is_Required);
                newLog.append(uniqueId, classMethodName + " | Content Id :" + contentId + ", Learner Id :" + learnerId, 75);
                // maintain the download record in LearnerContentM and increment content download count in TeacherContentM
                new DownloadService().SaveContentDownload(contentId, learnerId, newLog, uniqueId);
                DirectoryInfo dir = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Files/ContentDocuments/"));
                newLog.append(uniqueId, classMethodName + " | Directory :" + dir.Name, 75);
                var fileName = Path.GetFileName(DownloadService.GetContentFileNameByID(contentId));
                string fullPath = dir + "" + fileName;
                FileInfo file = new FileInfo(fullPath);
                string ContentType = "";
                string extainsion = Path.GetExtension(fullPath);
                switch (extainsion)
                {
                    case ".pdf":
                        ContentType = "application/pdf";
                        break;
                    case ".PDF":
                        ContentType = "application/pdf";
                        break;
                    default:
                        ContentType = "text/html";
                        break;
                }
                newLog.append(uniqueId, classMethodName + " | Content Type :" + ContentType, 75);
                if (String.IsNullOrEmpty(fullPath))
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                string reqBook = fullPath;
                string bookName = fileName;
                //converting Pdf file into bytes array
                var dataBytes = File.ReadAllBytes(reqBook);
                //adding bytes to memory stream 
                var dataStream = new MemoryStream(dataBytes);
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StreamContent(dataStream);
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };
                result.Content.Headers.ContentType = new MediaTypeHeaderValue(ContentType);
                return result;

            }
            else
            {
                newLog.append(uniqueId, classMethodName + " | Learner and Content Id's are empty.", 75);
                throw new Exception(Constants.contentId_Is_Required);

            }

        }
        catch (Exception ex)
        {
            newLog.append(uniqueId, classMethodName + " | Exception :" + ex.Message + "\t Inner Exception : " + ex.InnerException, 75);
            HttpResponseMessage httpResponse = new HttpResponseMessage();
            httpResponse.StatusCode = HttpStatusCode.BadRequest;
            httpResponse.Content = null;
            httpResponse.ReasonPhrase = ex.Message;
            return httpResponse;
        }
    }

Приведенный выше код работает нормально, если я запрашиваю его убраузер загружает файл, но когда я пытаюсь вызвать его из кода, он идет не так.ниже мой код при нажатии кнопки.

if (e.CommandName == "download")
            {
                // get content id from row hidden field
                int contentId = getIdFromHiddenField(e.Item.FindControl("hidContentId") as HiddenField);
                // get learner id from hidden field
                int learnerId = getIdFromHiddenField(hidLearnerId);

                // for download command get path of the file
                HiddenField hidFileName = e.Item.FindControl("hidFileName") as HiddenField;
                if (hidFileName != null)
                {
                    string serviceData = string.Format("api/Bilyak/DownloadContent?contentId={0}&learnerId={1}", contentId, learnerId);
                    HttpResponseMessage oData = DatabaseServices.DownloadContent(serviceData);
                    if (oData.IsSuccessStatusCode)
                    {
                       // Don't understand what should i do here....
                    }
                }
            }

Я не знаю, правильно ли я поступаю или нет.Любая помощь будет оценена ...

...