2013-08-16 2 views
0

"curl_easy_perform() failed : FTP 업로드 실패 (STOR 명령)"오류로 FTP 서버에 파일을 업로드하는 데 실패했습니다 .i 봤지만 많은 솔루션이나 제안을 찾을 수 없습니다. 여기에 문자 포인터가 발생하는 오류에 대한 좀 더 세부 사항이있을 것이다curl_easy_perform() 실패 : FTP 업로드 실패 (STOR 명령) 오류

#define LOCAL_FILE  "D:/er.txt"  
#define REMOTE_URL  "ftp://ftp.nso.edu/incoming/" 

using namespace std; 


static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    curl_off_t nread; 

    size_t retcode = fread(ptr, size, nmemb, (FILE*)stream); 

    nread = (curl_off_t)retcode; 

    fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T 
      " bytes from file\n", nread); 
    return retcode; 
} 


int main() 
{ 
    CURL *curl; 
    CURLcode res; 
    FILE *hd_src; 
    struct stat file_info; 
    curl_off_t fsize; 

    struct curl_slist *headerlist=NULL; 


    /* get the file size of the local file */ 
    if(stat(LOCAL_FILE, &file_info)) { 
    printf("Couldnt open '%s': %s\n", LOCAL_FILE, strerror(errno)); 
    return 1; 
    } 
    fsize = (curl_off_t)file_info.st_size; 

    printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize); 

    /* get a FILE * of the same file */ 
    hd_src = fopen(LOCAL_FILE, "rb"); 

    /* In windows, this will init the winsock stuff */ 
    curl_global_init(CURL_GLOBAL_ALL); 

    /* get a curl handle */ 
    curl = curl_easy_init(); 
    if(curl) { 


    /* we want to use our own read function */ 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); 

    /* enable uploading */ 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 

    /* specify target */ 
    curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL); 

    /* pass in that last of FTP commands to run after the transfer */ 
    curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist); 

    /* now specify which file to upload */ 
    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); 

    /* Set the size of the file to upload (optional). If you give a *_LARGE 
     option you MUST make sure that the type of the passed-in argument is a 
     curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must 
     make sure that to pass in a type 'long' argument. */ 
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, 
        (curl_off_t)fsize); 

    /* Now run off and do what you've been told! */ 
    res = curl_easy_perform(curl); 
    /* Check for errors */ 
    if(res != CURLE_OK) 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 

    /* clean up the FTP commands list */ 
    curl_slist_free_all (headerlist); 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    fclose(hd_src); /* close the local file */ 

    curl_global_cleanup();   




    // Wait for keystroke 
    getch(); 
    return 0; 
} 
+0

실제 URL을 사용하고 있습니까? 일반적으로 사용할 수있는 것 같지 않습니다 (또는 다운되었습니다). –

+0

나는 그것을 체크 아웃했었다. 그것의 작업 – user2682006

답변

0

설정

curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, char* allocatedMemoryForErrorBuffer); 

내 작은 코드입니다. 일반적으로이 HTTP 요청에 대해 작동하지만 내 이해뿐만 아니라 FTP 작동해야합니다.

+0

당신이 제안한 라인에서 다음과 같은 오류가 발생했다는 것을 제안한 후에 ​​그것을 수행했다. "char"전에 예상되는 primary-expression – user2682006

+0

plaknas는'char * aBuffer = new char [1000];'그리고'aBuffer'를 setopt에 전달합니다. –

+0

예, 메모리를 할당 한 다음 curl_easy_setopt에 전달하십시오. 나는 CURL이 필요에 따라 메모리 재 할당을 처리한다고 생각하지만, 이것은 디버깅을위한 것이기 때문에 정적 할당이 좋을 것입니다. 버퍼를 인쇄하면 어떤 일이 일어나는지 알려줍니다. 내 직감은 서버 측에서 뭔가 잘못되었다는 것입니다. – plaknas