从网址获取正确的下载文件大小

时间:2018-08-26 15:20:54

标签: c# .net http download uwp

我正在尝试从url(https://windows.php.net/downloads/releases/php-7.2.9-nts-Win32-VC15-x64.zip)中获取文件大小,这是我的代码-

public static Bitmap makeTransparent(Bitmap bit, Bitmap mask) {
    int width =  bit.getWidth();
    int height = bit.getHeight();
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    int [] allpixels = new int [ bmp.getHeight()*bmp.getWidth()];
    bit.getPixels(allpixels, 0, bmp.getWidth(), 0, 0, bmp.getWidth(),bmp.getHeight());
    bmp.setPixels(allpixels, 0, width, 0, 0, width, height);

    Bitmap bmpM = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    int [] allpixelsM = new int [ bmpM.getHeight()*bmpM.getWidth()];
    mask.getPixels(allpixelsM, 0, bmpM.getWidth(), 0, 0, bmpM.getWidth(),bmpM.getHeight());
    bmpM.setPixels(allpixelsM, 0, width, 0, 0, width, height);

    for(int i =0; i<bmp.getHeight()*bmp.getWidth();i++) {
        int A = (allpixelsM[i] >> 16) & 0xff;
        int R = (allpixels[i] >> 16) & 0xff;
        int G = (allpixels[i] >> 8) & 0xff;
        int B = (allpixels[i]) & 0xff;
        allpixels[i] = Color.argb(A, R, G, B);
    }

    bmp.setPixels(allpixels, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
    return bmp;
}

但是HttpWebRequest request = HttpWebRequest.CreateHttp(url); HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync()); long length = response.ContentLength; 的值为length,而网站(以及从浏览器下载时)报告的大小为598 bytes。我什至尝试从响应标头访问24.5MB,但它也具有相同的值"Content-Length"

我想念什么吗?还有其他方法可以更准确地获取文件大小吗?

1 个答案:

答案 0 :(得分:3)

我使用了您的示例网址,并通过以下方式读取了内容:

var dataStream = response.GetResponseStream();
var reader = new StreamReader(dataStream);
var responseFromServer = reader.ReadToEnd();

我得到的结果是:

  

2018年2月20日:嗨!我们似乎收到了来自空用户代理的大量请求。虽然这不应该成为问题,但是不幸的是,这导致该服务器上的带宽问题,导致所有下载不可用。因此,我们决定暂时阻止空用户代理,直到我们升级服务器带宽为止。

     

03 / mar / 2018:我们已经升级了服务器带宽。但是,这仍然不足以处理所有空的用户代理连接。请相应地更新您脚本中的用户代理或与我们联系,以便我们进行讨论。

     

谢谢您的理解。

它说设置UserAgent。因此,我将用户代理设置如下:

var request = HttpWebRequest.CreateHttp(url);
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1";
var response = (HttpWebResponse)(await request.GetResponseAsync());
var length = response.ContentLength;

现在,我得到了正确的Content-Length的{​​{1}}值

我刚刚从以下位置选择了一个用户代理字符串: http://www.useragentstring.com/index.php?id=19879

如果您仅对远程文件的大小感兴趣,则应考虑链接问题的答案。它实质上使用了不同的HTTP方法(HEAD与GET)

25691309

您可以在相关问题中找到有关HEAD Vs GET的更多详细信息: http HEAD vs GET performance