Прочитать двоичный файл и распечатать его содержимое (веб-сервер) - PullRequest
1 голос
/ 24 ноября 2011

Я работаю на веб-сервере и создал функцию, которая отправляет файл и заголовки http при доступе к http://127.0.0.1:8080 странице

. Проблема заключается в том, что файл неправильно копируется.. это бросает некоторый мусор в конце .. (я пытаюсь передать двоичные файлы, поэтому я использую std :: ios :: binary) example.bin

My Example bin file
:)

Загруженный файл:

My Example bin file
:)ýýýýÝÝÝÝÝÝÝhjß/ÝÝ

мой код:

// download file http headers
message_ = "HTTP/1.0 200 OK\r\n"
            "Cache-Control: public\r\n"
            "Content-Description: File Transfer\r\n"
            "Content-Disposition: attachment; filename=example.bin\r\n"
            "Content-Type: application/zip\r\n"
            "Content-Transfer-Encoding: binary\r\n\r\n";

std::filebuf *pbuf;
std::ifstream sourcestr;
long size;
char * buffer;

sourcestr.open("example.bin",std::ios::in | std::ios::binary);
pbuf=sourcestr.rdbuf();

size=pbuf->pubseekoff (0,std::ios::end,std::ios::in);
pbuf->pubseekpos (0,std::ios::in);

buffer=new char[size];

// get file data  
pbuf->sgetn (buffer,size);

message_ += buffer;

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Мне кажется, проблема в том, что buffer не завершается нулем после вызова pbuf-> sgetn (). Попробуйте:

// EDIT: this won't work for reason stated by @Joachim in his answer.
buffer = new char[size + 1];
pbuf->sgetn(buffer, size);
*(buffer + size) = 0;

message_ += buffer;

Если message_ является std::string, альтернатива без завершения NULL будет:

message_.append(buffer, size);

Надеюсь, это поможет.

0 голосов
/ 24 ноября 2011

Большая проблема в том, что вы добавляете содержимое двоичного буфера в строку. Строка в C ++ оканчивается символом «\ 0», что означает, что если двоичный файл содержит этот символ посередине, «строка» будет завершена. И если двоичный файл не содержит символа '\ 0', добавление его в строку добавит память до тех пор, пока не будет найден терминатор, что является причиной получения дополнительного мусора. Строка message_ += buffer просто означает добавление памяти, на которую указывает buffer, до тех пор, пока не будет найден терминатор строки.

Вы должны отправить файл в двух частях: сначала заголовок, затем данные файла.

...