Я занимаюсь разработкой web-сервера (Apache 2.4 в Linux) и пытается поддерживать загрузку файлов с клиентской стороны на сервер. Мне удалось получить файл на стороне сервера, но я получаю дополнительные заголовки в загруженном файле, который я хочу опустить. Например, я при загрузке example.txt, которые содержат:Загрузка файла на сервер Apache в C (без заголовков)
I'm the file content!
В стороне сервера файл я получаю:
------WebKitFormBoundaryqbGGz0VOmz7CVPCF
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: application/octet-stream
I'm the file content!
------WebKitFormBoundaryqbGGz0VOmz7CVPCF--
Фактический файл с бинарным, так что вы должны точно определить содержание без дополнение данные.
Я использовал эти примеры: mod_upload и mod_csv.
Мой север сторона код:
apr_bucket_brigade* bb;
apr_bucket* b;
int status = 0;
int end = 0;
char* fname = 0;
const char* buf;
apr_size_t bytes;
char buffer[512];
apr_file_t* tmpfile;
char* tmpname = apr_pstrdup(r->pool, "/tmp/tmp-upload.XXXXXX") ;
if (apr_file_mktemp(&tmpfile, tmpname, KEEPONCLOSE, r->pool) != APR_SUCCESS) {
ap_remove_input_filter(r->input_filters) ;
}
apr_pool_cleanup_register(r->pool, tmpfile, (void*)apr_file_close, apr_pool_cleanup_null) ;
bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
do {
status = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, APR_BLOCK_READ, BLOCKSIZE) ;
if (status == APR_SUCCESS) {
for (b = APR_BRIGADE_FIRST(bb) ; b != APR_BRIGADE_SENTINEL(bb) ; b = APR_BUCKET_NEXT(b)) {
if (APR_BUCKET_IS_EOS(b)) {
end = 1;
break;
}
else if (apr_bucket_read(b, &buf, &bytes, APR_BLOCK_READ) == APR_SUCCESS) {
apr_file_write(tmpfile, buf, &bytes);
char* x = apr_pstrndup(r->pool, buf, bytes);
if (fname)
fname = apr_pstrcat(r->pool, fname, x, NULL);
else
fname = x;
}
else {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Bucket read error") ;
}
}
}
else {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Brigade error") ;
}
apr_brigade_cleanup(bb);
} while (!end && status == APR_SUCCESS);
apr_brigade_destroy(bb);
return OK;
Любые идеи, как изменить код, чтобы избежать избыточных заголовков в содержании результата файла/любой другой путь (/) метод, чтобы получить файл на сервере?
Спасибо!
Я не использую mod_upload.c (я пробовал, но не получилось), я просто скопировать код оттуда (тот, который вы видите выше), поэтому я 'не вызывать set_header – ItayB