StreamContent не принимает длину потока - PullRequest
0 голосов
/ 16 апреля 2020

Я взаимодействую с dropbox и получаю файл по его пути, считываю его как поток, копирую содержимое этого потока в файловый поток и использую этот файловый поток для создания объекта StreamContent, который я могу добавить в свой multipart / данные формы:

[FunctionName("SendFiles")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage req,
            ILogger log)
{
    ...
    DropboxClient dropbox = new DropboxClient("token");

    MultipartFormDataContent formdata = new MultipartFormDataContent();
    string name = GetFileName(filePath);
    string tempfile = Path.GetTempFileName();
    string tempFilePath = getTempFilePath(tempfile, name);
    FileStream fs = File.Create(tempFilePath);
    using (var res = await dropbox.Files.DownloadAsync(filePath))
    {
          (await res.GetContentAsStreamAsync()).CopyTo(fs);
    }

    HttpContent content = new StreamContent(fs);

    content.Headers.Add("Content-Type", GetFileType(name));
    formdata.Add(content, "files", name);
    // System.IO.File.Delete(tempfile); at this point, we still are using the file for some reason and so I can't delete it
    // rest of the method, sending the content using httpClient
...
}

private static string getTempFilePath(string tempfile, string name)
{
    char[] charSeparators = new char[] { '\\' };
    var splitPath = tempfile.Split(charSeparators);
    splitPath[splitPath.Length - 1] = name;
    return String.Join("\\", splitPath);
}

private static string GetFileName(string path)
{
    char[] charSeparators = new char[] { '/' };
    var splitPath = path.Split(charSeparators);
    return splitPath[splitPath.Length - 1];
}

private static string GetFileType(string name)
{
    char[] charSeparators = new char[] { '.' };
    var splitName = name.Split(charSeparators);
    string extension = splitName[1].ToLower();
    switch (extension)
    {
        case "pdf":
              return "application/pdf";
        case "png":
              return "image/png";
        case "doc":
              return "application/msword";
        case "docx":
              return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        case "txt":
             return "text/plain";
        case "tif":
             return "image/tif";
        case "jpg":
            return "image/jpg";
        case "rtf":
            return "application/rtf";
        // default == not supported type, we don't set content type
        default:
            return "";
     }
}

Когда я отлаживаю, я ясно вижу, что длина потока обновляется при копировании в файловый поток, но когда я затем использую файловый поток для создания содержимого потока, длина контента остается 0. Как это происходит и что я могу сделать, чтобы это исправить?

1 Ответ

1 голос
/ 16 апреля 2020

Вы должны иметь возможность передавать поток из клиента Dropbox непосредственно в StreamContent, например:

HttpContent content = new StreamContent(await res.GetContentAsStreamAsync());
...