账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    http中content-disposition字符编码问题
    69
    0
    问题描述背景:业务上要实现一个post下载文件功能,返回的blob文件流,通过创建a标签下载文件。 在获取响应header中content-disposition的filename文件名时无法对中文乱码进行解码。content-disposition: attachment;filename=å•†å“æ ‡è¯†å…³è”å•†å“æ¸…å•-æ ‡è¯†ç¬¬äºŒç‰ˆæœ¬2021-12-06 14_33_40.xlsx采用decodeURIComponent(escape('å•†å“æ ‡è¯†å…³è”å•†å“æ¸…å•-æ ‡è¯†ç¬¬äºŒç‰ˆæœ¬2021-12-06 14_33_40.xlsx'))进行解码时报错VM179:1 Uncaught URIError: URI malformed at decodeURIComponent (<anonymous>) at <anonymous>:1:1但是如果通过浏览器get请求直接打开这个地址,谷歌浏览器是可以自动识别这种编码,可以下载正确命名的文件 是解码姿势不对吗?问题出现的环境背景及自己尝试过哪些方法尝试过将escape编码后的%替换为%25再进行decodeURIComponent,也无法解码出正常的文件名。
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 陌路离殇 普通会员 1楼

      在HTTP中,content-disposition是用于描述客户端如何在客户端发送的文档中将文件发送给服务器的属性。这个属性的值可以是inlineattachmentdataattachment-with-xmldoc等几种类型,其中:

      • inline:文件会直接嵌入到文档的<body>元素中,不会占用额外的存储空间,但是需要在服务器端将文件的二进制内容进行解码和压缩。
      • attachment:文件会被保存到服务器端的磁盘上,用户可以点击下载链接查看文件内容,文件的大小需要在服务器端的存储空间中得到确定,通常使用Content-Disposition: attachment; filename="filename"
      • data:文件会被保存到服务器端的内存中,用户可以拖拽文件到浏览器中查看文件内容,文件的大小可以是任意大小,不需要服务器端的存储空间,但是文件的内容可能需要浏览器来解码。
      • attachment-with-xmldoc:服务器端首先会将文件的内容解析为XML文档,然后将XML文档的内容保存到服务器端的磁盘上,文件的大小和内容都由解析XML文档的过程确定,适用于处理动态生成的XML文档。

      如果在客户端的HTTP请求中使用了content-disposition属性,并且服务器端的响应内容为Content-Disposition: attachment-with-xmldoc,那么客户端需要将XML文档的内容解码为字符串,然后将其作为Content-Disposition属性的值,例如:

      html <file download="example.xml" content-disposition="attachment-with-xmldoc"> <data content="Hello, World!"></data> </file>

      在这个例子中,example.xml是客户端发送给服务器的XML文档,内容为Hello, World!attachment-with-xmldoc表示服务器将XML文档的内容保存在服务器端的磁盘上,客户端需要将<data>元素的content属性的值设置为Hello, World!,以指定客户端将XML文档的内容作为Content-Disposition属性的值。

      需要注意的是,Content-Disposition属性只能在客户端的HTTP请求中使用,不能在服务器端的HTTP响应中使用,否则会导致服务器端无法解析响应内容,导致响应内容的无效。在实际的HTTP应用中,通常需要通过编程或者第三方库来处理content-disposition属性,以实现文件的上传、下载、解析等操作。

    • 何鸭丫 普通会员 2楼

      在HTTP中,content-disposition是用于描述客户端如何在客户端发送的文档中将文件发送给服务器的属性。这个属性的值可以是inlineattachmentdataattachment-with-xmldoc等几种类型,其中:

      • inline:文件会直接嵌入到文档的<body>元素中,不会占用额外的存储空间,但是需要在服务器端将文件的二进制内容进行解码和压缩。
      • attachment:文件会被保存到服务器端的磁盘上,用户可以点击下载链接查看文件内容,文件的大小需要在服务器端的存储空间中得到确定,通常使用Content-Disposition: attachment; filename="filename"
      • data:文件会被保存到服务器端的内存中,用户可以拖拽文件到浏览器中查看文件内容,文件的大小可以是任意大小,不需要服务器端的存储空间,但是文件的内容可能需要浏览器来解码。
      • attachment-with-xmldoc:服务器端首先会将文件的内容解析为XML文档,然后将XML文档的内容保存到服务器端的磁盘上,文件的大小和内容都由解析XML文档的过程确定,适用于处理动态生成的XML文档。

      如果在客户端的HTTP请求中使用了content-disposition属性,并且服务器端的响应内容为Content-Disposition: attachment-with-xmldoc,那么客户端需要将XML文档的内容解码为字符串,然后将其作为Content-Disposition属性的值,例如:

      html <file download="example.xml" content-disposition="attachment-with-xmldoc"> <data content="Hello, World!"></data> </file>

      在这个例子中,example.xml是客户端发送给服务器的XML文档,内容为Hello, World!attachment-with-xmldoc表示服务器将XML文档的内容保存在服务器端的磁盘上,客户端需要将<data>元素的content属性的值设置为Hello, World!,以指定客户端将XML文档的内容作为Content-Disposition属性的值。

      需要注意的是,Content-Disposition属性只能在客户端的HTTP请求中使用,不能在服务器端的HTTP响应中使用,否则会导致服务器端无法解析响应内容,导致响应内容的无效。在实际的HTTP应用中,通常需要通过编程或者第三方库来处理content-disposition属性,以实现文件的上传、下载、解析等操作。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部