Asp.net核心2.0问题中的文件上传创建0字节图像

时间:2018-02-19 12:54:42

标签: c# angular asp.net-core

我正在使用angular 5,使用asp.net core 2.0。我,我正在尝试将文件上传到服务器。代码将文件更新到服务器。但是有0 kb的数据,有时它会上传文件。

文件大小不大。它以KB为单位。

这是Angular代码

 public QuestionPostHttpCall(_questionPhotoVM: QuestionPhotoViewModel): Observable<GenericResponseObject<QuestionPhotoViewModel[]>> {
        const formData: FormData = new FormData();
        formData.append('FileUpload', _questionPhotoVM.FileUpload);
        formData.append('QuestionText', _questionPhotoVM.questionText);
        formData.append('QuestionId', _questionPhotoVM.questionId);
        const headers = new HttpHeaders().set('enctype', 'multipart/form-data');
        return this._httpClientModule.post<GenericResponseObject<QuestionPhotoViewModel[]>>(this.questionPhotoUrl, formData);
    }

在控制器I中,可以接收文件。

这是控制器方法

[HttpPost]
public JsonResult QuestionPhotoPost(IFormFile FileUpload, string QuestionText, Guid? QuestionId)
{
    string TempFileName = string.Empty;
    var directiveToUpload = Path.Combine(_environment.WebRootPath, "images\\UploadFile");
    var http = HttpRequestExtensions.GetUri(Request);
    QuestionViewModel model = new QuestionViewModel();
    try
    {

        if (FileUpload != null)
        {
            TempFileName = FileUpload.FileName;
            CheckFileFromFrontEnd();
        }

    }
    catch (Exception exception)
    {

    }

    void CheckFileFromFrontEnd()
    {
        if (FileUpload != null)
        {
            if (!System.IO.Directory.Exists(directiveToUpload))
            {
                System.IO.Directory.CreateDirectory(directiveToUpload);
            }
            if (System.IO.File.Exists(string.Format("{0}\\{1}\\{2}", _environment.WebRootPath, "images\\UploadFile", FileUpload.FileName)))
            {
                TempFileName = Guid.NewGuid().ToString() + FileUpload.FileName;
            }
            model.PictureUrl = string.Format("{0}://{1}/{2}/{3}/{4}", http.Scheme, http.Authority, "images", "UploadFile", TempFileName);
            SaveFileToServer(TempFileName);
        }

    }


    void SaveFileToServer(string FileName)
    {

        if (FileUpload.Length > 0)
        {
            using (var stream = new FileStream(Path.Combine(directiveToUpload, FileName), FileMode.Create))
            {
                FileUpload.CopyToAsync(stream);
            }
        }

    }
    return Json(genericResponseObject);
}

将文件上传到服务器。但有时它上传0字节,有时上传正确。

文件的分辨率为570 X 400,文件大小为197KB

我在哪里,做错了?请有人告诉我。我需要在某处指定最大字节吗?

1 个答案:

答案 0 :(得分:5)

您的问题是您使用的是异步功能,而不是await它 您正在使用ASP.NET Core,因此您应该(阅读&#34;必须&#34;)使用async-all-way方式:

[HttpPost]
public async Task<JsonResult> QuestionPhotoPost(IFormFile FileUpload, string QuestionText, Guid? QuestionId)
{
    string TempFileName = string.Empty;
    var directiveToUpload = Path.Combine(_environment.WebRootPath, "images\\UploadFile");
    var http = HttpRequestExtensions.GetUri(Request);
    QuestionViewModel model = new QuestionViewModel();
    try
    {

        if (FileUpload != null)
        {
            TempFileName = FileUpload.FileName;
            await CheckFileFromFrontEndAsync();
        }

    }
    catch (Exception exception)
    {

    }

    async Task CheckFileFromFrontEndsync()
    {
        if (FileUpload != null)
        {
            if (!System.IO.Directory.Exists(directiveToUpload))
            {
                System.IO.Directory.CreateDirectory(directiveToUpload);
            }
            if (System.IO.File.Exists(string.Format("{0}\\{1}\\{2}", _environment.WebRootPath, "images\\UploadFile", FileUpload.FileName)))
            {
                TempFileName = Guid.NewGuid().ToString() + FileUpload.FileName;
            }
            model.PictureUrl = string.Format("{0}://{1}/{2}/{3}/{4}", http.Scheme, http.Authority, "images", "UploadFile", TempFileName);
            await SaveFileToServerAsync(TempFileName);
        }

    }

    async Task SaveFileToServerAsync(string FileName)
    {
        if (FileUpload.Length > 0)
        {
            using (var stream = new FileStream(Path.Combine(directiveToUpload, FileName), FileMode.Create))
            {
                await FileUpload.CopyToAsync(stream);
            }
        }
    }

    return Json(genericResponseObject);
}

为了使代码更具可读性,我将这些内联函数移到外面。