Как асинхронно загрузить файл Word в основной веб-API .NET и сохранить в папку - PullRequest
0 голосов
/ 17 октября 2019

Я являюсь свидетелем кода для загрузки файла слова в web-интерфейсе ядра .net, который работает нормально синхронно, но так как этот процесс требует времени, поэтому сообщение об успехе приходит только после загрузки файла, но я хочу изменить этот метод асинхронно, чтобы пользовательне нужно ждать загрузки файла и повторного сообщения о том, что «этот процесс займет некоторое время», и при фоновой загрузке файла должно произойти. Он не должен блокировать пользователя, чтобы он не выполнял другие операции из-за загрузки файла.

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

html и код Javascript-

 <button id="fake-file-button-browse" type="button" class="btn btn-default" style="width:38px;height:34px;display:none"></button>
<input type="text" id="fileurl-name" style="width:50%;display:none" placeholder="File not selected" class="form-control">
<input class="Uploader" type="file" id="fileurl">

C #, в контроллере Web API

public async Task<ActionResult> UploadAndConvertFile()
{

    try
    {

            List<string> listValues = new List<string>();
            foreach (string key in Request.Form.Keys)
            {
                listValues.Add(Request.Form[key]);
            }

            List<string> details = new List<string>()
            {
                listValues[0],listValues[2],listValues[5]
            };
            _response = _iOperation.GetAllFiles(details, CustomerId, "Legal Team");

            if (_response.ResponseContent != "Already Exist" && _response.StatusCode != 500)
            {
                Operation.UploadedFileDetails uploadedFileDetails = new Operation.UploadedFileDetails();

                uploadedFileDetails.CustomFileName = listValues[0];
                uploadedFileDetails.FileDescriptions = listValues[1];
                uploadedFileDetails.FileCategory = listValues[2];
                uploadedFileDetails.IsActive = !Convert.ToBoolean(listValues[3]);
                uploadedFileDetails.FileID = Convert.ToInt32(listValues[5]);


                    Microsoft.AspNetCore.Http.IFormFile file = Request.Form.Files[0];
                    System.Threading.Tasks.Task.Run(() => UploadFile(uploadedFileDetails,file));

                    _response.StatusCode = 200;
                    _response.ResponseContent = "File Upload will take some time.Please come after sometime.";
                    return StatusCode(Convert.ToInt16(_response.StatusCode), _response.ResponseContent);






            }

    } catch (Exception ex)
        {
            connection.fnHandleConnectionError(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName.ToString() + "." + System.Reflection.MethodBase.GetCurrentMethod().Name.ToString(), ex.ToString(), connection.ConnectionString);
        }
        return StatusCode(Convert.ToInt16(_response.StatusCode), _response.ResponseContent);
    }

    public async Task<Library.APIResponse> UploadFile(UploadedFileDetails uploadedFileDetails, Microsoft.AspNetCore.Http.IFormFile File)
    {

        var file = File;
        object documentFormat = 8;
        string randomName = DateTime.Now.Ticks.ToString();
        string folderName = "Uploads\\";
        string webRootPath = _hostingEnvironment.WebRootPath;
        string combinedPath = Path.Combine(webRootPath, folderName);
        object htmlFilePath = combinedPath + randomName + ".htm";
        string directoryPath = combinedPath + randomName + "_files";
        string fileSavePath = combinedPath + Path.GetFileName(file.FileName);
        object fileSavePath1 = combinedPath + Path.GetFileName(file.FileName);
        //If Directory not present, create it.
        if (!Directory.Exists(combinedPath))
        {
            Directory.CreateDirectory(combinedPath);
        }
        _Application applicationclass = new Application();
        //Upload the word document and save to Uploads folder.

        try
        {
            if (file.Length > 0)
            {

                var filePath = Path.GetTempFileName();

                using (var stream = System.IO.File.Create(filePath))
                {
                    await file.CopyToAsync(stream);
                }

            }
            //Open the word document in background.
            applicationclass.Documents.Open(ref fileSavePath1);
            applicationclass.Visible = false;
            Document document = applicationclass.ActiveDocument;
            try
            {
                //Save the word document as HTML file.
                document.SaveAs(ref htmlFilePath, ref documentFormat);

                //close the doccument
                document.Close();
            }
            catch (Exception)
            {
                document.Close();
                throw;
            }

            //close the application
            applicationclass.Quit();
        }
        catch (Exception ex)
        {
            applicationclass.Quit();
            connection.fnHandleConnectionError(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName.ToString() + "." + System.Reflection.MethodBase.GetCurrentMethod().Name.ToString(), ex.ToString(), connection.ConnectionString);
            throw;
        }
        //Read the saved Html File.
        string wordHTML =await System.IO.File.ReadAllTextAsync(htmlFilePath.ToString(), Encoding.Default);

        //Replace Image path
        wordHTML = wordHTML.Replace("src=\"", "src=\"Uploads/");

        //Delete the Uploaded Word File.
        System.IO.File.Delete(fileSavePath.ToString());

        uploadedFileDetails.DocFileName = file.FileName;
        uploadedFileDetails.HTMLFileName = randomName + ".htm";
        uploadedFileDetails.FileLocation = combinedPath;
        _response = await _iOperation.LogFileDetailsToDB(uploadedFileDetails); //This code to log to database the record

    return _response;
}

Сначала вызывается метод UploadAndConvertFile, который внутренне вызывает метод UploadFile, поэтому сначала он должен возвратить сообщение, что «загрузка этого файла займет некоторое время». и в фоновом режиме он должен вызвать метод UploadFile.

Это вызывает метод UploadFile, но когда он достигает
await file.CopyToAsync(stream); Эта строка собирается перехватить блок и выдать ошибку «Не удается получить доступ к удаленному объекту. Имя объекта: 'FileBufferingReadStream'."

Заранее спасибо.

...