【问题标题】:File Upload in Asp.net core 2.0 issue creating 0 byte ImageAsp.net core 2.0 中的文件上传问题创建 0 字节图像
【发布时间】:2018-07-29 17:17:09
【问题描述】:

我正在使用 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);
    }

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

这里是控制器方法

[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

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

【问题讨论】:

    标签: c# angular asp.net-core


    【解决方案1】:

    您的问题是您使用的是异步函数而不是 awaiting 它。
    您正在使用 ASP.NET Core,因此您应该(阅读“必须”)使用 async-all-the-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);
    }
    

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

    【讨论】:

    • 你忘了等待 OP 最初没有等待的同一件事 :)
    • @Evk 哎呀,你是对的。我最初只修复了SaveFileToServerAsync,然后决定更改所有内容并忘记了那个。谢谢!
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 2020-04-01
    • 2019-02-23
    • 2015-05-21
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多