Ulfius:文件上传会创建损坏的文件

时间:2017-06-22 15:16:26

标签: c file-upload

我正在编写一个应用程序,可以使用C中的ulfius 1.0.4 Framework通过HTML表单上传文件。

如果我上传一个包含几行文字的简单文本文件,一切都运行良好。 但是如果我像JPG格式的图片一样上传更复杂的东西,那么应用程序创建的文件就不像用户上传的原始文件。无法显示创建的图片。 我用十六进制编辑器打开了创建的文件。前4个字节是相同的。但在那之后,我看到看起来像HTTP标题的部分。

这是我的回调函数:

driver.findElement(By.xpath("//input[@name='fileType' AND @id='id8-1']")).click();

这是我的HTML表单:



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;
}




非常感谢!

2 个答案:

答案 0 :(得分:0)

如果您正在编写二进制文件,则应使用"wb"而不是"w"。因为"w"可以在某些系统上更改行尾字符。

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

还有一件事,不要忽视功能的返回值,有些事情可能会出错,但无论如何你的代码都会继续存在。所有fopen()fwrite()fclose()都返回一个值,唯一一个值可能被忽略的值是fclose(),但是不应该忽视休息。

答案 1 :(得分:0)

我找到了解决方案。 可以获取整个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;
}

感谢您的回复!