linux - 如何在 Linux 中从 HTTP MIME 编码消息中提取文件数据?

标签 linux bash sed awk

我有一个程序,接受HTTP POST文件并将所有POST结果写入文件,我想编写一个脚本来删除HTTP header ,只保留二进制文件数据,该怎么做?

文件内容如下(Content-Type: application/octet-stream------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3 之间的数据为我想要什么:

POST /?user_name=vvvvvvvv&size=837&file_name=logo.gif& HTTP/1.1^M
Accept: text/*^M
Content-Type: multipart/form-data; boundary=----------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
User-Agent: Shockwave Flash^M
Host: 192.168.0.198:9998^M
Content-Length: 1251^M
Connection: Keep-Alive^M
Cache-Control: no-cache^M
Cookie: cb_fullname=ddddddd; cb_user_name=cdc^M
^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Filename"^M
^M
logo.gif^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Filedata"; filename="logo.gif"^M
Content-Type: application/octet-stream^M
^M
GIF89an^@I^^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Upload"^M
^M
Submit Query^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3-

最佳答案

您想在文件结束时执行此操作,还是在文件结束后执行此操作?

几乎任何脚本语言都应该可以工作。我的 AWK 有点生疏,但是...

awk '/^Content-Type: application\/octet-stream/,/^--------/'

这应该打印 application/octet-stream--------- 行之间的所有内容。它还可能包含这两行,这意味着您必须做一些更复杂的事情:

BEGIN {state = 0}
{
    if ($0 ~ /^------------/) {
        state = 0;
    }
    if (state == 1) {
        print $0
    }
    if ($0 ~ /^Content-Type: application\/octet-stream/) {
        state = 1;
    }
}

application\/octet-stream 行位于 print 语句之后,因为您希望在看到 后将 state 设置为 1 >应用程序/八位字节流

当然,作为 Unix,您可以通过 awk 通过管道输出程序的输出,然后保存文件。

关于linux - 如何在 Linux 中从 HTTP MIME 编码消息中提取文件数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4236020/

相关文章:

linux - 如何通过 shell 脚本中的命令行在 Expect 中传递参数

linux - 如何将 StdOut 添加到文件的顶部(而不是底部)?

linux - 将列表插入字符串

linux - 删除存储在文件中的完整路径的路径前缀

sed - 使用 sed 根据括号提取字符串

c - 在 Linux 中获取/设置 pthread 调度策略

php - 获取目录的最后修改时间

linux - 尝试在 bash 中更改文件名

python - 如何添加到每行末尾附近的数字

c - 从 C 源代码中删除特定函数的所有实例