上载OneDrive API文件时损坏

时间:2020-10-19 06:05:17

标签: api microsoft-graph-api onedrive

当我通过onedrive API上传和下载文件时,它表示文件已损坏。

在请求API时将文件转换为字节,这是关于请求部分的错误吗? API调用成功,但是当我打开文件时,文件似乎已损坏。

[HttpPost("{id}")]
    [RequestFormLimits(MultipartBodyLengthLimit = long.MaxValue)]
    [DisableRequestSizeLimit]
    public ActionResult OneDriveUploadFiles(string id, [FromForm] IFormFile files)
    {
        string fileName = files.FileName;
        int fileSize = Convert.ToInt32(files.Length);

        var uploadProvider = new JObject();
        var res = new JArray();

        if (fileSize < 4194304)
        {
            var sResult = _oneDriveGraphService.UploadFiles(id, fileName, files).Result;
            res.Add(sResult);
        }
        
        
        var result = this.SaveFileDownloadLink(res);
        return Ok(result);
    }

public async Task<JObject> UploadFiles(string upn, string fileName, IFormFile files)
    {
       var responseCode = HttpStatusCode.OK;
        var jObject = new JObject();

        int idx = 0;
        int fileSize = Convert.ToInt32(files.Length);
        int fragSize = 4 * 1024 * 1024; //4MB => 4 * 1024 * 1024;
        var byteRemaining = fileSize;
        var numFragments = (byteRemaining / fragSize) + 1;

        while (idx < numFragments)
        {
            var chunkSize = fragSize;
            var start = idx * fragSize;
            var end = idx * fragSize + chunkSize - 1;
            var offset = idx * fragSize;

            if (byteRemaining < chunkSize)
            {
                chunkSize = byteRemaining;
                end = fileSize - 1;
            }

            var contentRange = " bytes " + start + "-" + end + "/" + fileSize;
            byte[] file = new byte[chunkSize];
            using (var client = new HttpClient())
            {
                var content = new ByteArrayContent(file);
                content.Headers.Add("Content-Length", chunkSize.ToString());
                content.Headers.Add("Content-Range", contentRange);

                var response = client.PutAsync(url, content);
                var strData = response.Result.Content.ReadAsStringAsync().Result;
                responseCode = response.Result.StatusCode;

                //업로드 성공
                if (responseCode == HttpStatusCode.Created)
                {
                    JObject data = JObject.Parse(strData);
                    string downloadUrl = data["@content.downloadUrl"].ToString();
                    string itemId = data["id"].ToString();

                    //파일 크기 -> kb로 변환
                    fileSize = fileSize / 1000;
                    jObject = JObject.FromObject(new { name = files.FileName, id = itemId, url = downloadUrl, size = (double)fileSize });
                }
                //업로드 충돌
                else if (responseCode == HttpStatusCode.Conflict)
                {
                    var restart = RestartByteFile(upn, url, files.FileName);
                    responseCode = restart;
                }
            }
            byteRemaining = byteRemaining - chunkSize;
            idx++;
        }

        if (responseCode == HttpStatusCode.Created) { return jObject; }
        else return jObject = JObject.FromObject(new { result = "실패" });
    }

我想知道为什么文件损坏了。

当我将其转换为字节并上载时,似乎出现错误。还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

块大小(最后一个除外)应为320KiB的倍数。这是你的问题吗?