【问题标题】:File not streaming as expected in Asp.Net Core controller在 Asp.Net Core 控制器中文件未按预期流式传输
【发布时间】:2020-12-18 05:51:55
【问题描述】:

我正在尝试将文件上传到我的 onedrive,按预期获取文件似乎没有相应地处理,谁能指出我的问题。

代码 sn-p:

public async Task<IActionResult> UploadFileOnFolder(IFormFile uploadedFile, string folderName)
{
    try
    {
        if (uploadedFile.Length > 0)
        {
            dynamic response;
            var fileName = ContentDispositionHeaderValue.Parse(uploadedFile.FileName).FileName.Trim('"');

            using var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(fileName));
                response =  await _graphServiceClient.Me.Drive.Items[folderName].Content
                                  .Request()
                                  .PutAsync<DriveItem>(stream);

            ViewData["FileUploadInfo"] = response;
        }
        else
        {
            ViewData["message"] = "Sorry Upload failed! Please check your file!";
        }
     }
     catch (Exception ex)
     {
         ViewData["message"] = ex.Message;
     }

     return RedirectToAction("RecentDirveInfo");
}

注意:我在关注this official document.

【问题讨论】:

  • UTF8.GetBytes(fileName) 返回文件名的 UTF8 表示,而不是文件的内容。

标签: c# asp.net-core azure-active-directory microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

我不确定 APi,但我知道您正在尝试将文件名作为文件上传。您可能希望使用 uploadedFile.OpenReadStream 并将其传递给 PutAsync

打开请求流以读取上传的文件。

using var stream = uploadedFile.OpenReadStream();
response =  await _graphServiceClient.Me.Drive.Items[folderName].Content
                 .Request()
                 .PutAsync<DriveItem>(stream);

【讨论】:

  • 试过你的解决方案似乎流工作正常,但上传时仍然出现异常Invalid request,你上传文件成功了吗?
  • 可能还有其他错误。无论如何,您都需要考虑此更正。
  • 感谢您对此的回答和努力。我得到了我正在寻找的答案。
  • @MdFaridUddinKiron 一切顺利,祝你好运 :)
【解决方案2】:

试试下面的代码:

public async Task<IActionResult> UploadFileOnFolder(IFormFile uploadedFile, string folderName)
        {
            try
            {

                if (uploadedFile.Length > 0)
                {
                    dynamic response;

                    var fileName = uploadedFile.FileName;
                    using var stream = uploadedFile.OpenReadStream();
                    response = await _graphServiceClient.Me.Drive.Root.ItemWithPath(folderName +"/" + fileName).Content.Request().PutAsync<DriveItem>(stream);
                        
                    ViewData["FileUploadInfo"] = response;
                }
                else
                {
                    ViewData["message"] = "Sorry check your file!";
                }

            }
            catch (Exception ex)
            {

                ViewData["message"] = ex.Message;
            }
            return RedirectToAction("RecentDirveInfo");
        }

我已经对它进行了测试,它非常适合我:

顺便说一句,在运行此代码之前,请确保您已将以下委派权限授予您的 Azure AD 应用程序:

Files.ReadWrite, Files.ReadWrite.All, Sites.ReadWrite.All

【讨论】:

  • 这与原始代码有何不同?如果解决方案很明确,那么仅代码的答案是可以接受的,但这里不是这种情况。所有这些代码发生了什么变化?
  • @PanagiotisKanavos 使用代码:'_graphServiceClient.Me.Drive.Root.ItemWithPath(folderName +"/" + fileName).Content.Request().PutAsync(stream);'而不是 '_graphServiceClient.Me.Drive.Items[folderName].Content .Request() .PutAsync(stream);'
  • 感谢您的确切观点,我以错误的方式尝试!在这一行中` response = await _graphServiceClient.Me.Drive.Root.ItemWithPath(folderName +"/" + fileName).Content.Request().PutAsync(stream);`
  • 更新答案并明确相关部分是什么。在阅读其他答案之前,您无法理解您做了什么
  • @PanagiotisKanavos 我有两个问题一个是 streming 和 rigth 格式我从一开始就尝试过这一行' await graphClient.Me.Drive.Items["{item-id}"].Content .Request () .PutAsync(stream);` 但无法使其工作。
猜你喜欢
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多