我正在开发网络服务器(Linux 中的 Apache 2.4)并尝试支持从客户端到服务器端的文件上传。我成功地在服务器端接收了文件,但是我在上传的文件内容中得到了一个额外的 web 标题,我想省略它。例如,我在上传 example.txt 时包含:
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;
任何想法如何更改代码以避免结果文件内容中的冗余标题/任何其他方式(/方法)在服务器中获取文件?
谢谢!