网站url实现下载文件时,修改浏览器 默认自动保存文件名

网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同。

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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值