网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同。
Content-Disposition
使用 HTTP Header 的 Content-Disposition: attachment 可以实现下载时强制弹出下载对话框。
Content-Disposition: attachment; filename=filename.ext
Content-Type
浏览器对已知类型的文件(如jpg、pdf、txt等)直接在浏览器内打开,我们通过设置http头中的 Content-Type 来改变浏览器认知的文件类型。 这里把Content-Type 设置为octet-stream,也就是二进制文件流。这样浏览器就会直接打开文件,而不是在浏览器内打开。
Content-Type: application/octet-stream
转载自:
原文链接:https://blog.csdn.net/wwd0501/article/details/49891023
举例:
void appweb_sock_response(MprSocket *pSock, char *pResBuf, UINT64 iRespLen
, char *pMimeType, int httpCode, int httpVer, char *pFileName)
{
AppwebVec_T ioVec;
int errCode;
int len, totalLen;
char szHeadBuf[512] = {0};
printf("appweb_sock_response4DZ 11\n");
if(!pSock)
{
printf("appweb_sock_response4DZ 22\n");
return;
}
len = 0;
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "HTTP/1.%d %d %s\r\n", httpVer, httpCode, appweb_get_code_string(httpCode));
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "%s", "Connection: close\r\n");
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "%s", "Pragma: no-cache\r\n");
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "%s", "Cache-Control: no-cache\r\n");
if(pFileName)
{
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "Content-Disposition: attachment; filename=%s\r\n", pFileName);
}
if(pMimeType)
{
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "Content-Type: %s\r\n", pMimeType);
}
if(iRespLen>0)
{
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "Content-Length: %llu\r\n", iRespLen);
}
len += snprintf(szHeadBuf+len, sizeof(szHeadBuf) - len, "%s", "\r\n");
bzero(&ioVec, sizeof(ioVec));
appweb_add_to_vetor(&ioVec, szHeadBuf, len);
printf("download return HTTP header:%s\n", szHeadBuf);
if(pResBuf && iRespLen>0)
{
appweb_add_to_vetor(&ioVec, pResBuf, iRespLen);
}
totalLen = ioVec.ioCount;
while(totalLen>0)
{
if(appweb_poll(pSock, MPR_WRITABLE, APPWEB_WAIT_MIL_SEC) <= 0)
{
perror("appweb_poll err:");
}
len = mprWriteSocketVector(pSock, ioVec.iovec, ioVec.ioIndex);
if(len<=0)
{
perror("mprWriteSocketVector err:");
errCode = mprGetOsError();
if(errCode== EAGAIN || errCode == EWOULDBLOCK)
{
continue;
}
break;
}
appweb_adjust_io_vec(&ioVec, len);
totalLen -= len;
}
return;
}