我正在编写一个应用程序,可以使用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;
}

非常感谢!
答案 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;
}
感谢您的回复!