Я являюсь свидетелем кода для загрузки файла слова в 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'."
Заранее спасибо.