>

파일을 클라이언트의 ftp 사이트 중 하나에 업로드하기 위해 작은 Windows Forms 응용 프로그램을 만들었습니다. 그러나 내가 겪고있는 문제는 로컬 컴퓨터 에서이 응용 프로그램을 실행할 때 파일을 성공적으로 업로드한다는 것입니다. 하지만 서버에서이 프로그램을 실행하면이 오류 메시지가 나타납니다.

remote server returned an error: (550) File unavailable (eg, file not found, can not access the file), on this line 'objFTPRequest.GetRequestStream();'.

아무도 이유를 아는 사람이 있습니까? 방화벽 등을 구성해야합니까? 여기 내 코드가 있습니다;

FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;
// Create FtpWebRequest object 
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));
// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
// By default KeepAlive is true, where the control connection is 
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;
// Set the data transfer type.
objFTPRequest.UseBinary = true;
// Set content length
objFTPRequest.ContentLength = objFile.Length;
// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;
// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];
// Opens a file to read
FileStream objFileStream = objFile.OpenRead();

// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();
int len = 0;
while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
    // Write file Content 
    objStream.Write(objBuffer, 0, len);
}
            objStream.Close();
            objFileStream.Close();

  • 답변 # 1

    이 오류는 서버에 파일이 없거나 파일에 대한 보안 권한 등과 같은 여러 가지 이유로 인해 발생할 수 있습니다.

    먼저 오류의 정확한 원인을 찾아야합니다. 이것은 다음 코드를 사용하여 달성 할 수 있습니다-

    try
    {
            //Your code
    }
    catch(WebException e)
    {
            String status = ((FtpWebResponse)e.Response).StatusDescription;
    }
    
    

    정확한 오류의 원인을 찾으면 앞으로 해결할 수 있습니다.

    여기에 참조 할 수있는 링크가 있습니다

    http://forums.asp.net/t/1777881.aspx/1

    http://nickstips.wordpress.com/2010/10/25/c-ftp-upload-error-the-remote-server-returned-an-error-550-file-unavailable-eg-file-not -found-no-access/

    http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/

    http://forums.asp.net/t/1374306.aspx/1

  • 답변 # 2

    다음을 시도하십시오 : ftp : //xxx.xxx.xx.xx : 21 // path/filename

    서버 주소 뒤의 "//"는 루트 디렉토리에서 시작합니다. 비록 내가 가지고 있지만 : ftp : //xxx.xxx.xx.xx : 21/path/filename, 올바른 디렉토리로 이동하지 못했습니다.

  • 답변 # 3

    같은 문제가 발생하여 다음과 같이했습니다.

    <올>

    운영 체제에 쓰기 권한이 있는지 확인하십시오. ftp 폴더 찾기 =>오른쪽 click =>properties =>보안,해야 할 일을 알아야합니다

    ftp 서버가 로그인 한 사용자에게 쓰기 권한이 있는지 확인하십시오. IIS를 열고 =>ftp 사이트를 클릭하십시오. =>ftp 인증 규칙 =>추가 허용 규칙 =>사용자 또는 그룹을 선택하여 권한 설정

    ftp 서버에서 디렉토리를 확인하고, 항목 2에서 동일한 작업을 수행하십시오.

    네 가지 그림을 사용하여 설정할 권한을 표시 할 수 있습니다.

  • 답변 # 4

    더 간단 할 수 있습니다

    유사한 문제에 직면하여 제안 된 모든 솔루션을 시도했지만 아무도 작동하지 않습니다. 다음과 같이 간단한 방법으로 알아 봅니다. 살펴보기

    끝에 잘못된 코드

    Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)
    
    

    이 간단한 것으로 바꾸십시오 :

    Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)
    
    

    그런 다음 채우기 요청을 처리하고 서버로 보내기 :)

    그게 다야

    서버에 대한 모든 권한이 제대로 작동하고 올바른 자격 증명을 사용하고 있는지 확인하십시오.

  • 답변 # 5

    이 문제를 해결하려면 System.Net.FtpWebRequest 명령을 강제로 되돌려 야합니다. .Net Framework 2.0/3.5에서 작동하는 방법에 대한 이전 동작과 실제 명령을 실행하기 전에 추가 CWD 명령을 발행합니다.

    이 작업을 수행하려면 System.Net.FtpWebRequest 클래스의 인스턴스를 호출하기 전에 다음 코드를 배치해야합니다. 아래 코드는 전체 애플리케이션 도메인의 설정이 변경되므로 한 번만 호출하면됩니다.

    private static void SetMethodRequiresCWD()
    {
            Type requestType = typeof(FtpWebRequest);
            FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
            Type methodInfoType = methodInfoField.FieldType;
    
            FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
            Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);
            FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);
            int MustChangeWorkingDirectoryToPath = 0x100;
            foreach (object knownMethod in knownMethodsArray)
            {
                int flags = (int)flagsField.GetValue(knownMethod);
                flags |= MustChangeWorkingDirectoryToPath;
                flagsField.SetValue(knownMethod, flags);
            }
     }
    
    

    http://support.microsoft.com/kb/2134299

  • 이전 Windows에서 기본 소켓 버퍼 크기 변경
  • 다음 c++ - QDataStream을 사용하여 QTcpSocket에서 읽기