c - 将文件上传到 C 中的 apache 服务器(没有 Web header )

标签 c apache file-upload webserver apache-modules

我正在开发网络服务器(Linux 中的 Apache 2.4)并尝试支持从客户端到服务器端的文件上传。 我成功地在服务器端接收到文件,但我在上传的文件内容中得到了一个额外的 Web header ,我想忽略它。例如,我在上传 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_uploadmod_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;

任何想法如何更改代码以避免结果文件内容中的冗余 header /任何其他方式(/方法)在服务器中获取文件?

谢谢!

最佳答案

http://apache.webthing.com/mod_upload/mod_upload.c

这里

static void set_header(upload_ctx* ctx, const char* data) 

此函数添加标题。如果您不需要 header ,则不要在该文件中调用此函数。

关于c - 将文件上传到 C 中的 apache 服务器(没有 Web header ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29919504/

相关文章:

c - 为什么我的 fork 程序的输出在我通过管道输出时会有所不同?

php - CORS/访问控制允许来源

javascript - 有人对 Andrew Valums Ajax Upload (qq.FileUploader Basic) 脚本有经验吗?

c - 扫描抛物线函数ax ^ 2 + bx + c的a,b和c值的数组

c - 使用循环数组越界?

java - 实现 ASN.1 描述

php - UTF-8贯穿始终

php - 为什么只有一台服务器抛出错误 "Array to String Conversion"?

jquery - 在一个请求中上传多个文件 Dropzone 发送两个请求

java - Spring MVC 文件上传 - 仅在 IE 中 - 异步 IO 操作失败(1),原因 : RC: 10053