2017-06-22 153 views
1

我使用的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)'呢? –

回答

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

感謝您的答覆!

0

如果你正在編寫一個二進制文件,你應該使用"wb"而不是僅僅是"w"。因爲"w"可能會更改某些系統上的行尾字符。

此外,沒有理由從我能想到的長度中減去sizeof(char),但我不知道該框架是什麼以及它是否需要操作。

還有一件事,不要忽略函數的返回值,有些東西可能會出錯,但是您的代碼仍會繼續。所有的fopen(),fwrite()fclose()返回一個值,唯一的值可以可能被忽略的是fclose(),但其餘的不應該被忽略。