首页 > 解决方案 > 下载后处理图片

问题描述

我使用 CopyToAsync 将图像下载到本地服务器。下载后,我必须使用 FluentFTP 将文件上传到另一个网络服务器。

我下载图像的代码是:

public static async Task DownloadImage(Entity.LoginResult loginResult, string saveFolder, string image, string saveFile)
    {
        string filename = System.IO.Path.GetFileNameWithoutExtension(saveFile);
        string extension = System.IO.Path.GetExtension(saveFile);
        {
            saveFile = GetValidUrlString(filename, "-", 255) + extension;
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), apiUrl + image + "/download"))
                {
                    request.Headers.TryAddWithoutValidation("Authorization", "CBX-SIMPLE-TOKEN Token=" + loginResult.token);
                    var response = httpClient.SendAsync(request).Result;
                    if (response.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        using (var fs = new FileStream(saveFolder + saveFile, FileMode.Create))
                        {                                
                            await response.Content.CopyToAsync(fs);
                        }
                    }
                }
            }
        }
    }

调用 DownloadImage 后,我想检查文件是否已下载,如下所示:

if (System.IO.File.Exists(saveFolder + media.filename))
{ Call ftp  }

ftp 处理图像时出现以下错误

  1. 图像未下载(System.IO.File.Exist = False)
  2. 映像正在进行中,由于文件正在使用,FTP 失败。

谁能告诉我如何使用 async/await 以便下载和上传都完成

标签: c#asynchronousasync-await

解决方案


  1. 将线路更改var response = httpClient.SendAsync(request).Result;
    var response = await httpClient.SendAsync(request); 在我目前正在工作的公司中,.Result有时这样的任务无法正常工作。

  2. 如果下载失败,抛出。

    if (response.StatusCode != System.Net.HttpStatusCode.OK) { throw new Exception("download failed"). }

  3. 为确保下载发生,您需要像这样使用 await 调用它
    await DownloadImage(params)

  4. 好的做法是“一次异步,全部异步”。这意味着当您使用一个异步时,您的所有代码都应该是异步的。


推荐阅读