生成内容型的下载接口如何给前端友好提示? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
abcbuzhiming
V2EX    程序员

生成内容型的下载接口如何给前端友好提示?

  •  
  •   abcbuzhiming 2018-09-12 21:15:05 +08:00 2704 次点击
    这是一个创建于 2653 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个接口是专门为 web 前端生成图片以提供给下载的,地址类似这样:
    http://www.domain.com/create/image
    后端直接生成图片内容,修改 Response 的 ContentType 为 image/jpeg,前端以 get 方式直接点击这个接口地址,就会在浏览器弹出下载保存框。
    我们为了防止前端出现恶意频繁访问,于是针对 cookie 限制了当前一个请求还未处理完时,后一个请求不会进入生成图片逻辑,而是直接返回,但是现在问题出在返回内容上,不管我返回任何内容,都会导致当前页面的 dom 内容被这个新内容彻底覆盖,因为是 get 请求且不是 ajax 的。所以没法做到只改局部内容。我们希望能给予用户比较友好的提示,但是不要修改当前页面的内容。有没有办法实现这一点
    12 条回复    2018-09-13 12:05:10 +08:00
    6IbA2bj5ip3tK49j
        1
    6IbA2bj5ip3tK49j  
       2018-09-12 21:30:15 +08:00
    一张固定的图片,提示用户正在加载中?
    leekafai
        2
    leekafai  
       2018-09-12 21:30:34 +08:00 via Android
    Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");
    billlee
        3
    billlee  
       2018-09-12 22:42:15 +08:00   1
    我怎么觉得最简单的方法是把前端改成 ajax
    abcbuzhiming
        4
    abcbuzhiming  
    OP
       2018-09-12 22:53:24 +08:00
    @billlee ajax 不能下载啊
    westoy
        5
    westoy  
       2018-09-12 22:53:59 +08:00
    iframe 大法好
    abcbuzhiming
        6
    abcbuzhiming  
    OP
       2018-09-12 23:23:24 +08:00
    @westoy 请讲一下具体实施办法
    libook
        7
    libook  
       2018-09-13 00:46:04 +08:00
    请求的时候加上 query 参数,把当前页面的地址传给服务器,服务器鉴权,如果判定合法就返回真实内容,判断不合法就返回 307 的状态,重定向地址为原发起下载的页面地址,后面拼接状态参数,原页面上做一个常规检查,只要遇到这个状态参数就展示友好提示。
    panpanpan
        8
    panpanpan  
       2018-09-13 08:14:34 +08:00 via iPhone
    @abcbuzhiming 通过 file api
    去保存
    forgcode
        9
    forgcode  
       2018-09-13 08:56:37 +08:00 via Android
    单独这个鉴权的借口,通过了在给下!
    xiangyuecn
        10
    xiangyuecn  
       2018-09-13 10:20:49 +08:00
    @westoy iframe 大法+1,普通的表单上传、普通的连接下载,target 到 iframe 中执行,和 xhr 异曲同工
    abcbuzhiming
        11
    abcbuzhiming  
    OP
       2018-09-13 11:53:39 +08:00
    @xiangyuecn iframe 大法还是存在一个问题,无法确认事件发生,我不知道何时下载开始,因为从点击按钮到下载正式开始(或结束)有一段时间。这段时间内,下载按钮在前端应该屏蔽,让用户无法点击,然后在下载开始或结束时重新激活下载按钮。这个在 ajax 里很容易,但是在这种非 ajax 操作里面就无比困难。。。
    xiangyuecn
        12
    xiangyuecn  
       2018-09-13 12:05:10 +08:00
    @abcbuzhiming 那就用 ajax 啊,把数据先 load 下来,然后给一个按钮,让用户点击保存。blob+a 标签 download

    或者下载完得到 blob 对象后,自动弹保存示例代码:

    var url=URL.createObjectURL(
    new Blob(["abcd"],{"type":"text/plain"})
    );
    var downA=document.createElement("A");
    downA.innerHTML="不让点";
    downA.href=url;
    downA.download="data.txt";
    document.body.appendChild(downA);
    downA.click();
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5198 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 07:19 PVG 15:19 LAX 23:19 JFK 02:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86