Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Asp.net Web Api控制器获取文件名_C#_Xamarin_Asp.net Web Api2 - Fatal编程技术网

C# 从Asp.net Web Api控制器获取文件名

C# 从Asp.net Web Api控制器获取文件名,c#,xamarin,asp.net-web-api2,C#,Xamarin,Asp.net Web Api2,我有一个Web Api控制器,可以获取文件。服务器 [HttpGet] [Route("api/FileDownloading/download")] public HttpResponseMessage GetDocuments() { var result = new HttpResponseMessage(HttpStatusCode.OK); var fileName = "QRimage2.jpg"; var f

我有一个Web Api控制器,可以获取文件。服务器

[HttpGet]
    [Route("api/FileDownloading/download")]
    public HttpResponseMessage GetDocuments()
    {
        var result = new HttpResponseMessage(HttpStatusCode.OK);

        var fileName = "QRimage2.jpg";
        var filePath = HttpContext.Current.Server.MapPath("");
        var fileBytes = File.ReadAllBytes(@"c:\\TMP\\QRimage2.jpg");
        MemoryStream fileMemStream = new MemoryStream(fileBytes);

        result.Content = new StreamContent(fileMemStream);

        var headers = result.Content.Headers;

        headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");

        headers.ContentDisposition.FileName = fileName;

        headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

        headers.ContentLength = fileMemStream.Length;

        return result;
    }
和XamarinAndroid客户端,即使用控制器下载文件


这一切都很好,但在我的Android设备上,在文件浏览器中,我的文件名是下载文件,而不是QRimage2.jpg。如何使用此控制器获取实际文件名?

这是否始终是jpg?如果是这样的话,我会将MediaTypeHeaderValue更改为image/jpeg——这样做可以告诉浏览器文件的确切类型,而不是一般文件。我认为这是一个问题,因为你告诉Android浏览器它只是一个普通的二进制文件


您需要使用web响应来读取内容配置。因此,我们不能直接使用DownloadFileAsync

public async Task<string> DownloadFileAsync(string url, string folder)
{
    var request = WebRequest.Create(url);
    var response = await request.GetResponseAsync().ConfigureAwait(false);
    var fileName = string.Empty;

    if (response.Headers["Content-Disposition"] != null)
    {
        var contentDisposition = new System.Net.Mime.ContentDisposition(response.Headers["Content-Disposition"]);

        if (contentDisposition.DispositionType == "attachment")
        {
            fileName = contentDisposition.FileName;
        }
    }

    if (string.IsNullOrEmpty(fileName))
    {
        throw new ArgumentException("Cannot be null or empty.", nameof(fileName));
    }

    var filePath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, folder, fileName);

    using (var contentStream = response.GetResponseStream())
    {
        using (var fileStream = File.Create(filePath))
        {
            await contentStream.CopyToAsync(fileStream).ConfigureAwait(false);
        }
    }

    return filePath;
}

它可以是任何类型。
public async Task<string> DownloadFileAsync(string url, string folder)
{
    var request = WebRequest.Create(url);
    var response = await request.GetResponseAsync().ConfigureAwait(false);
    var fileName = string.Empty;

    if (response.Headers["Content-Disposition"] != null)
    {
        var contentDisposition = new System.Net.Mime.ContentDisposition(response.Headers["Content-Disposition"]);

        if (contentDisposition.DispositionType == "attachment")
        {
            fileName = contentDisposition.FileName;
        }
    }

    if (string.IsNullOrEmpty(fileName))
    {
        throw new ArgumentException("Cannot be null or empty.", nameof(fileName));
    }

    var filePath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, folder, fileName);

    using (var contentStream = response.GetResponseStream())
    {
        using (var fileStream = File.Create(filePath))
        {
            await contentStream.CopyToAsync(fileStream).ConfigureAwait(false);
        }
    }

    return filePath;
}