我想下载并播放服务器机器上的m3u8文件。我使用以下代码来读取和发送m3u8文件到Web服务器。 浏览器显示文件的内容而不是下载它。 所以请让我知道,如何下载它。
if ((exportHandle = fopen(v3FileName, "a+")) != NULL) {
long end = 0, start = 0, pos = 0;
char* m3u8FileDataBuff = NULL;
fseek(exportHandle, 0, SEEK_END);
end = ftell(exportHandle);
fseek(exportHandle, 0, SEEK_SET);
start = ftell(exportHandle);
pos = end - start;
m3u8FileDataBuff = (char *) malloc(pos);
end = 0;
start = 0;
fread(m3u8FileDataBuff, 1, pos, exportHandle);
pClienCommunication->writeBuffer(m3u8FileDataBuff, pos);
free(m3u8FileDataBuff);
fclose(exportHandle);
}
答案 0 :(得分:0)
客户端的Web浏览器正在显示内容,因为响应的MIME类型为nil,或类似" text / plain"。正确设置http响应标头以指示m3类型的m3u8文件(application/x-mpegURL
或vnd.apple.mpegURL
)。
您提供的一段代码似乎没有在响应标题周围设置任何内容,只是内容。
检查pClienCommunication->
的可用API,或者发布源自哪里,您可以选择调整响应标头。
或者也可以通过在为响应提供服务的Web服务器中设置某些规则,为某些URL设置MIME类型或根据响应内容(但应用此类规则)来解决此问题在Web服务器级别上通常比在C ++部分中创建时调整响应更昂贵。
为什么这个标记的C ++,当代码本身就像C一样有它的所有问题。在现代C ++中,你永远不会做像" fclose(..)"这样的事情,因为这是在文件包装器类的析构函数中完成的,所以你不会冒险fclose将被跳过以防万一在fread等中引发的一些例外
所以在现代C ++中,这些东西应该看起来像这样:
{
SomeFileClass exportFile(v3FileName, "a+");
if (exportFile.isOK()) {
SomeFileContentBuffer data = exportFile.read();
pClienCommunication->writeBuffer(data.asCharPtr(), data.size());
}
}
所以你不能忘记释放任何文件句柄或缓冲区内存(因为特定帮助程序类的析构函数会处理它)。