2012-10-10 8 views
0

이미 이와 비슷한 질문이 있지만 answer given does not solve my problem입니다. 여기 내 코드는Curllib을 사용하여 전송 후 파일 이름 바꾸기

입니다. . struct curl_slist * slist = NULL;

curl_easy_setopt(Curl, CURLOPT_UPLOAD, 1L); 
curl_easy_setopt(Curl, CURLOPT_URL, "sftp://user:[email protected]:22/my_temp_file.txt"); 
curl_easy_setopt(Curl, CURLOPT_READFUNCTION, my_read_func)); 
curl_easy_setopt(Curl, CURLOPT_READDATA, &my_read_data); 

slist = curl_slist_append(slist, "RNFR my_temp_file.txt"); 
slist = curl_slist_append(slist, "RNTO my_file.txt"); 

curl_easy_setopt(Curl, CURLOPT_POSTQUOTE, slist); 

rc = curl_easy_perform(Curl); 

. . .

위의 코드를 실행하면 CURLE_QUOTE_ERROR가 표시됩니다. 파일 전송은 실제로 발생하지만 이름이 변경되지 않습니다. 게시물 따옴표 옵션을 생략하면 오류없이 모든 작업이 완료됩니다.

나는 /에서 다른 이름으로 모든 다른 형식을 시도했지만 아무 소용이 없습니다. 어떤 아이디어?

+0

내가 이미 '이름 바꾸기'명령을 시도했습니다. 실제로 나는 성공하지 못한 수많은 변주 (RNFR/RNTO, 이름 바꾸기, 전체 경로, ". \", "\", "./", "/"등)를 사용하여 경로를 유무에 관계없이 모두 시도했습니다. 매우 실망합니다. –

답변

2

문서는 말한다 :

유효한 SFTP 명령은 다음을 chgrp, chmod를 chown 함수, LN, MKDIR, PWD, 이름 바꾸기, RM, RMDIR, 심볼릭 링크 (참조 컬 (1))

"이름 바꾸기"를 사용하여 파일의 이름을 바꿉니다.

사용하신 RNFR/RNTO는 FTP 명령이며 이름이 유사하더라도 FTP와 비교하여 SFTP가 매우 다릅니다.

+0

Daniel, 위의 내 의견을 참조하십시오. (이미 시도한 이름 바꾸기) –

+1

질문에 대한 귀하의 코드는 여전히 잘못되었습니다. 디렉토리 트리에서 사용자가 SFTP로 "로그인"합니다. 단순히 잘못된 경로를 사용하는 것 같습니다. –

0

는 FTP 컬 예제이 SFTP 버전은 나를 위해 잘 작동 :

/*************************************************************************** 
*         _ _ ____ _ 
* Project      ___| | | | _ \| | 
*       /__| | | | |_) | | 
*       | (__| |_| | _ <| |___ 
*        \___|\___/|_| \_\_____| 
* 
* Copyright (C) 1998 - 2017, Daniel Stenberg, <[email protected]>, et al. 
* 
* This software is licensed as described in the file COPYING, which 
* you should have received as part of this distribution. The terms 
* are also available at https://curl.haxx.se/docs/copyright.html. 
* 
* You may opt to use, copy, modify, merge, publish, distribute and/or sell 
* copies of the Software, and permit persons to whom the Software is 
* furnished to do so, under the terms of the COPYING file. 
* 
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 
* KIND, either express or implied. 
* 
***************************************************************************/ 
/* <DESC> 
* Gets a file using an SFTP URL. 
* compile me: 
* gcc sftpup.c -lcurl -o sftpup.exe 
* </DESC> 
*/ 
#include <stdio.h> 
#include <string.h> 

#include <curl/curl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <errno.h> 
#ifdef WIN32 
#include <io.h> 
#else 
#include <unistd.h> 
#endif 

/* <DESC> 
* Performs an FTP upload and renames the file just after a successful 
* transfer. 
* </DESC> 
*/ 

#define LOCAL_FILE  "/tmp/uploadthis.txt" 
#define UPLOAD_FILE_AS "while-uploading.txt" 
#define REMOTE_URL "sftp://[email protected]:/data/upload/" UPLOAD_FILE_AS 
#define RENAME_FILE_TO "renamed-and-fine.txt" 

/* NOTE: if you want this example to work on Windows with libcurl as a 
    DLL, you MUST also provide a read callback with CURLOPT_READFUNCTION. 
    Failing to do so will give you a crash since a DLL may not use the 
    variable's memory when passed in to it from an app like this. */ 
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    curl_off_t nread; 
    /* in real-world cases, this would probably get this data differently 
    as this fread() stuff is exactly what the library already would do 
    by default internally */ 
    size_t retcode = fread(ptr, size, nmemb, stream); 

    nread = (curl_off_t)retcode; 

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

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

    struct curl_slist *headerlist = NULL; 
    static const char buf_1 [] = "rename /data/upload/" UPLOAD_FILE_AS " /data/upload/" RENAME_FILE_TO; 

    /* 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) { 
    /* build a list of commands to pass to libcurl */ 
    headerlist = curl_slist_append(headerlist, buf_1); 

    /* 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(); 
    return 0; 
}