0
HTTP/1.1 200 OK
Content-Type:text/html

<html><body><img src=\"http://localhost:5000/twitter.png\" alt=\"Smiley face\" height=\"256\" width=\"256\"/></body></html>

如果我更改,请在此 http 响应示例中

Content-Type:image/*

其他一切都是一样的。那么它有什么不同呢?当我用我写的简单的测试网络服务器进行测试时:

在第一种情况下 - 浏览器正在接收确切的 html,但没有显示图像。一个带有三角形、圆形嵌入矩形的小图像出现了。

在第二种情况下 content-type: image/* 请求的图像正在下载,但图像无法打开。

例如,如果

Content-Type = image/png

图像没有被下载,但浏览器感知的 html 正在改变,比如

 <html>
 <body style="margin: 0px;">
 <img style="-web-user-select: none" src="http://localhost:5000"/>
 </body>
 </html>

我的问题是如何使用这些内容类型?


Http 响应:

 HTTP/1.1 200 OK
 Content-Type:image/png
 Content-Lenth:27892
 Server:Learnee

 \211PNG

g9\357ax\257a>\307\365\333\324\3658\313
\234H\245\374\215\321\371\373\317\302Rh \364\263K\353\273\362\312+\243\200\\321\376\217\337\360u)\373X\355q*1\267\235\342;I\316\341\265\310\317I:q\332\325\317{0\245T\334^WH#l  s\200\231\2422\252q>;\346\312d\252X\201\365\312\304%:\216H\316\306\372{\323axDB\215\3178Y\345\254*\245\366R\357a\235    җ\2148\252D\236S\232\231\370z\342w\337\375V\265Z\315c/:,d\311<շ\367D1\356\337\326֖\373\242\263t\351\325\377IRmo\264R\376S\200\352_\276\242K7\214\263\333{\230\267횥\313qc\317\347S\3022<ه\202\273ڟ\203l\310\344\216\356M\322Я\225\240\300=N1\277\271\355\327ߺtv̀ٙ\231\231\374\226-[\204~\265U\341\220OO\344\211q\316\257\246\276\345&\354\352\227\325!\274<\264\233\234\352p\263\301\3237\275\334و\203]\2712\371\332\306I\222\207\233\341獶\215\257&7Y7 K\302u@\373\235\370   0\275\373ؾ$\235B$z?\200zD\343yǯܓ\356\241BW\327\320m\214\337\301f\327@\300a\201\262C\257\244\216p\366\330\220\325\301@\215\332G/-\320Ԃ\267\246X%\344ȔD\216N{\277Q\277\3361M\276\264~/i\213\3529D\320@`\307\314N@=\334\316\200\272\300)\367}?<L\233D\372\227\275-[$\375\330.\222\257T\351\313em\377\263q]:\307@p%Xӭ\204\222\365>8K\266ga\200@
H3\352Z3\200R\320\347SU\301
G>\323!\307tD\200\205{~\370\3524\371鶌&gt;S\220\263D5\224(@\214SN\221{\264L@f\216%\247\200  \360\3455\376Y`\341s\263U2YR\214p\363\320pA[?\237A\270@\357\214\221\273x!\240*\327o\231"\367\215\314\325&E\321Su \220)\200\243\261\363@\200\335a\265\337.\242~Y\300\242d\214f\232\262\231\275E\370㣫W\257\216%\223\3114(~
+=\261\347EP|\264\377G\200L\213řB\241\220۴iS\371\251\247\236r\360OD\231\371G\376a\354tt
\364~6\217\3471\364'

从文件中获取数据的代码:

bool ServerFileSystem::getDataFromFile(std::string urlPath, std::string& chunkData)
{
std::stringstream stream;
std::cout << urlPath << std::endl;

if(!strcmp(urlPath.c_str(), "/"))
{
    urlPath = urlPath + "index.html";
    std::cout << "URL Path: " << urlPath;
}

std::string localPath = SERVER_ROOT + urlPath;
std::ifstream file(localPath.c_str());

file.seekg(0, std::ifstream::beg);

while(file.tellg() != -1)
{
    char *p = new char[1024];

    bzero(p, 1024);
    file.read(p, 1024);

    stream << p;
    stream.flush();

    delete p;
}

chunkData = stream.str();

file.close();

return true;
} 

我以字符串的形式获取整个数据并附加必要的标题。因此,我发送的最终响应是代码上方显示的响应。

4

1 回答 1

1
HTTP/1.1 200 OK
Content-Type:text/html

<html>[...]</html>

如果我将 [the Content-Type-header] 更改为Content-Type:image/*,其他一切都一样。那么它有什么不同呢?

你很幸运:你的浏览器遵循稳健性原则。它可能会说:“我不知道您要做什么,但我不会将 HTML 呈现为图像。我想我只会发出“无法显示页面”错误”

取而代之的是:“等等,内容看起来确实像 HTML,为什么不试试看呢?” .

您将希望像这样提供您的 HTML,图像也是如此:使用适当的图像 MIME 类型提供它们。

也可以看看:

RFC 2045,第 5 节

Content-Type 字段的目的是充分描述正文中包含的数据,以便接收用户代理可以选择适当的代理或机制将数据呈现给用户,或者以适当的方式处理数据。该字段中的值称为媒体类型。

于 2012-11-05T15:31:26.737 回答