Ulfius:文件上传创建碎文件

问题描述:

我使用的ulfius 1.0.4框架下Ulfius:文件上传创建碎文件

通过HTML表单上传文件,如果我上传一个简单的文本文件的几个能力编写的应用程序一行文字一切正常。 但是,如果我上传更复杂的图片,如JPG格式,应用程序创建的文件不像用户上传的原始文件。创建的图片无法显示。 我用十六进制编辑器打开了创建的文件。前4个字节是相同的。但在此之后,我会看到看起来像HTTP标头的部分。

这是我的回调函数:

int callback_upload_file(const struct _u_request * request, struct _u_response * response, void * user_data) { 
int i; 
const char **keys, *fileName, *fileContent; 
size_t len; 
keys = u_map_enum_keys(request->map_post_body); 
for (i = 0; keys[i] != NULL; i++) { 
    if (strcmp(keys[i], "dateiname") == 0) { 
     fileName = u_map_get(request->map_post_body, keys[i]); 
    } 

    if (strcmp(keys[i], "datei") == 0) { 
     fileContent = u_map_get(request->map_post_body, keys[i]); 
     len = u_map_get_length(request->map_post_body, keys[i]); 
    } 
} 

FILE *fp; 
fp = fopen(fileName, "w"); 
fwrite(fileContent, sizeof (char), len - sizeof (char), fp); 
fclose(fp); 

response->string_body = msprintf("File uploaded!"); 
response->status = 200; 

return U_OK; 
} 

这是我的HTML表单:

<form method="post" action="/upload" enctype="multipart/form-data"> 
 
\t <input id="upload" name="datei" type="file"> 
 
\t <p>Dateiname <input id="filename" name="dateiname" type="text"></p> 
 
\t <input type="submit" name="hochladen" value="hochladen"> 
 
</form>

非常感谢!

+1

这将是由非法内存访问导致的未定义行为。如果可能,请使用内存调试程序,并且应该快速修复它。另外,你是否知道'sizeof(char)'总是1?你为什么要从长度上减去'sizeof(char)'呢? –

我找到了解决方案。 有可能获得整个HTTP请求。我正在搜索头文件的末尾(\ r \ n \ r \ n)并将以下数据写入文件。 这是整个回调函数:

int callback_upload_file(const struct _u_request * request, struct _u_response * response, void * user_data) { 
int i; 
const char **keys, *fileName, *fileContent; 
size_t len; 
keys = u_map_enum_keys(request->map_post_body); 

for (i = 0; keys[i] != NULL; i++) { 
    if (strcmp(keys[i], "dateiname") == 0) { 
     fileName = u_map_get(request->map_post_body, keys[i]); 
    } 

    if (strcmp(keys[i], "datei") == 0) { 
     len = u_map_get_length(request->map_post_body, keys[i]); 
    } 
} 

fileContent = strstr(request->binary_body, "\r\n\r\n"); 
fileContent += 4; 

FILE *fp; 
if ((fp = fopen(fileName, "wb")) == NULL) { 
    return U_ERROR; 
} 

if ((fwrite(fileContent, 1, len - 1, fp)) != len - 1) { 
    return U_ERROR; 
} 
fclose(fp); 

response->string_body = msprintf("File uploaded!"); 
response->status = 200; 

return U_OK; 
} 

感谢您的答复!

如果你正在编写一个二进制文件,你应该使用"wb"而不是仅仅是"w"。因为"w"可能会更改某些系统上的行尾字符。

此外,没有理由从我能想到的长度中减去sizeof(char),但我不知道该框架是什么以及它是否需要操作。

还有一件事,不要忽略函数的返回值,有些东西可能会出错,但是您的代码仍会继续。所有的fopen(),fwrite()fclose()返回一个值,唯一的值可以可能被忽略的是fclose(),但其余的不应该被忽略。