gpt4 book ai didi

内容处置文件名 "suggestion"始终被忽略。为什么?

转载 作者:行者123 更新时间:2023-11-30 19:39:32 25 4
gpt4 key购买 nike

这是用 C 语言编写的 CGI 程序的一部分。当客户端单击链接时,我希望开始下载文件,并使用建议的默认文件名。

我知道规范明确指出 Content-disposition header 中指定的文件名仅仅是建议的,但似乎无论我使用什么浏览器,它总是被忽略。我将这种行为解释为我做错了什么。

这是一个重现我的问题的精简代码片段。当编译为 test.cgi 时,程序可以运行,但浏览器使用文件名“test.cgi”而不是建议的“archive.tar.gz”保存数据。

(删除了文件 I/O 错误检查和其他安全位,以保持清晰和简短。)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#define CHUNK_SIZE 1024

int main( int argc, char *argv[] ) {
int fd;
long bytes_remaining, bytes_to_get, bytes_read, bytes_sent, retval;
int chunksize;
unsigned char data_buffer[CHUNK_SIZE];
char header_str[200];

fd = open( "archive.tar.gz", O_RDONLY );
if( fd == -1 ) {
printf( "Content-type: text/html\n\n" );
printf( "Unable to open file: %s.<br><br>\n", strerror(errno) );
return 0;
}

bytes_remaining = lseek( fd, 0, SEEK_END );
lseek( fd, 0, SEEK_SET );

snprintf( header_str, 200, "Content-Type: application/x-compressed\r\n\r\nContent-Disposition: attachment; filename=\"archive.tar.gz\"\r\n\r\n" );
write( 1, header_str, strlen(header_str) );

while( bytes_remaining > 0 ) {
if( bytes_remaining > CHUNK_SIZE ) bytes_to_get = CHUNK_SIZE;
else bytes_to_get = bytes_remaining;
bytes_read = read( fd, data_buffer, bytes_to_get );
bytes_sent = write( 1, data_buffer, bytes_read );
bytes_remaining -= bytes_sent;
}
close( fd );

return 0;
}

为什么我建议的文件名始终被忽略?

谢谢。

最佳答案

问题是标题中有一个额外的回车/换行符。应该是:

snprintf( header_str, 200, "Content-Type: application/x-compressed\r\nContent-Disposition: attachment; filename=archive.tar.gz\r\n\r\n" );

正如OP中所写,Content-Disposition行将被解释为数据的一部分,而不是 header 的一部分。此外,不需要在建议的文件名周围加引号。

关于内容处置文件名 "suggestion"始终被忽略。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36387301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com