【问题标题】:Get the correct content-length of remote files获取远程文件的正确内容长度
【发布时间】:2012-01-12 14:11:06
【问题描述】:

我正在尝试获取远程文件的内容长度,以便可以限制远程图像的下载大小:

 WebResponse response = this.GetWebRequest().GetResponse();

 long contentLength = response.ContentLength;

 // WebResponse.ContentLength doesn't always know the value, 
 // it returns -1 in this case.
 if (contentLength == -1)
 {
     // Response headers may still have the Content-Length inside of it.
     string headerContentLength = response.Headers["Content-Length"];

     if (!String.IsNullOrWhiteSpace(headerContentLength))
     {
         contentLength = long.Parse(headerContentLength,
                                            CultureInfo.InvariantCulture);
     }
 }

我的问题是,由于 content-length 标头是可选的,因此有时该值是不确定的。

我读过类似的问题herehere,这似乎表明我可以以某种方式使用 Transfer-Encoding=chunked 属性来确定长度,但我没有找到如何执行此操作的示例。

这可能吗?谁能给我一个代码示例?

【问题讨论】:

  • 它是可选的(虽然我假设图像几乎总是存在),所以不,你不能在所有情况下都确定这个值。
  • @BrokenGlass 我会这么认为,但调试和使用萤火虫检查都表明并非如此。我专门看的图片在这里images.mymovies.net/images/film/cin/500x377/fid10122.jpg
  • @James South:我在该特定 URL 的响应中看到 Content-Length: 33566hurl.it/hurls/c79a3f4611819c370e53a30d07958ee1892862b9/…
  • @Piskvor:奇怪... hurl.it 必须下载文件并报告长度或使用比我的开发服务器更智能的东西,因为我根本没有获得该属性。
  • @James South:我的所有客户端(FF 9、Chrome 16、IE 6、7、8、Opera 11、wget 1.12)似乎都与 Hurl 一致(来自 Internet 上的多个位置) ,不少于) - 我看到完全相同的标题。你确定这不是你身边的东西吗?

标签: c# asp.net http


【解决方案1】:

不,一般情况下这是不可能的。

确定的唯一方法是下载整个资源,看看它有多大。特别是对于动态生成和/或流式传输的资源,可能无法判断响应的大小(例如,实时流甚至具有明确定义的开始或结束- 它可以继续将流作为一个巨大的分块响应发送)。

chunked 属性是一个未知大小的解决方法 - 块之前是下一个块的大小;但是,无法预测会有多少块,也无法预测大小。

另外:警告 Content-Length,有(甚至在 2012 年!)错误的实现会误报它。

【讨论】:

  • 所以没有办法打开,下载到一个上限,打开后关闭一个分块连接?
  • @James South:哦,当然——你可以打开,发送请求,然后继续下载,直到服务器告诉你“没有更多的块”。没有办法告诉究竟什么时候会发生,直到它发生(此时你有完整的响应,你可以检查它的字节大小)。
  • 所以我需要做的是一次下载每个块,检查下一个块的长度,并在组合长度达到我的咬​​合大小上限时添加相应的块长度关闭连接?
  • @James South:这样你可能会得到一个不完整的响应(如果你的上限太低);更好的方法是在获得零大小的块时关闭连接(因为那是“传输完成”标记)。但是,是的,如果您对预期的大小有一个粗略的了解(例如,在 2012 年,5 MB 的图像应该就足够了),那么设置一个限制可能会很有用。
  • 酷...我大概知道我的上限是多少,所以知道如何编码吗?我被难住了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2016-04-23
相关资源
最近更新 更多