2008-10-02 37 views
20

के साथ एफ़टीपी फ़ाइल अपलोड करें HTTP प्रॉक्सी के पीछे एक FTP सर्वर पर फ़ाइल अपलोड करने का कोई तरीका है?HTTP प्रॉक्सी

ऐसा लगता है कि फ़ाइल अपलोड करना .NET Webclient का उपयोग कर HTTP प्रॉक्सी के पीछे समर्थित नहीं है। (http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.proxy.aspx)।

यदि कोई कामकाज नहीं है? यदि नहीं, तो क्या आप एक अच्छी और मुफ्त एफ़टीपी लाइब्रेरी जान सकते हैं जिसका मैं उपयोग कर सकता हूं?

संपादित: दुर्भाग्य से, मैं करने के लिए कनेक्ट करने के लिए किसी भी FTP प्रॉक्सी नहीं है।

+0

आपको यह सुनिश्चित करना आपकी कंपनी के लिए एक एफ़टीपी प्रॉक्सी भी नहीं है रहे हैं? – VVS

+1

मुझे एक ही समस्या है। क्या आपको एक समाधान मिला? –

+0

और यदि आपने किया, तो यह किस प्रकार का लाइसेंस था? एक स्रोत वितरण अच्छा होगा। –

उत्तर

-5

आईडी वास्तव में http प्रॉक्सी के बीच कनेक्शन नहीं देखता है और एक FTP सर्वर पर अपलोड नहीं करता है। यदि आप http प्रॉक्सी क्लास का उपयोग करते हैं जो http संसाधनों को एक्सेस करने के लिए http प्रॉक्सी को एक्सेस करता है। ftp एक और प्रोटोकॉल है और ftp प्रॉक्सी एक अलग प्रोटोकॉल का उपयोग करते हैं।

+3

HTTP प्रॉक्सी की कनेक्ट विधि को न भूलें। विधि मनमाने ढंग से आउटबाउंड टीसीपी कनेक्शन की सुरंग की सुविधा प्रदान करती है। उदाहरण के लिए, एचटीटीपीएस HTTP प्रॉक्सी के माध्यम से काम करता है। – Alexander

9

सक्रिय एफ़टीपी मोड में, सर्वर क्लाइंट को डेटा कनेक्शन शुरू करता है। यदि ग्राहक HTTP प्रॉक्सी के पीछे है, तो यह स्पष्ट रूप से काम नहीं करेगा। निष्क्रिय एफ़टीपी मोड में यह क्लाइंट है जो आरंभिक और डेटा कनेक्शन दोनों को शुरू करता है। चूंकि HTTP प्रॉक्सी अनियंत्रित आउटगोइंग टीसीपी कनेक्शन (CONNECT विधि का उपयोग करके) को सुरंग कर सकती हैं, इसलिए एक HTTP प्रॉक्सी के माध्यम से निष्क्रिय मोड में एक FTP सर्वर तक पहुंचना संभव होना चाहिए।

FtpWebRequest निष्क्रिय मोड का समर्थन करने लगता है। हालांकि, मुझे समझ में नहीं आता कि फ़ाइल डाउनलोड और निर्देशिका लिस्टिंग क्यों समर्थित हैं, जबकि फ़ाइल अपलोड, जो एक ही डेटा कनेक्शन का उपयोग करता है, नहीं है।

क्या आपने पुष्टि की है कि निष्क्रिय मोड के लिए कॉन्फ़िगर किया गया FtpWebRequest HTTP प्रॉक्सी के माध्यम से काम नहीं करता है जिसके माध्यम से निर्देशिका सूची/फ़ाइल डाउनलोड काम ठीक है?

+4

यह कमी दस्तावेज है: "यदि निर्दिष्ट प्रॉक्सी एक HTTP प्रॉक्सी है, तो केवल डाउनलोडफाइल, ListDirectory, और ListDirectoryDetails कमांड समर्थित हैं।" - http://msdn.microsoft.com/en-us/library/system.net। ftpwebrequest.proxy.aspx –

5

सबसे एफ़टीपी प्रॉक्सी कनेक्शन पर उनके काम करते हैं, इसलिए यदि आप कोई प्रॉक्सी था, तो आप ऐसा करते हैं:

  • सर्वर: myftpserver.com
  • उपयोगकर्ता: मुझे
  • पासवर्ड: लोक निर्माण विभाग

एक एफ़टीपी प्रॉक्सी का उपयोग कर, आप कार्य करें:

  • सर्व एर: ftpproxy.mydomain.com
  • उपयोगकर्ता: [email protected]
  • पासवर्ड: लोक निर्माण विभाग

और यह सिर्फ वहाँ से बाहर काम करता है। मैं इस दाहिनी ओर इसका उपयोग कर रहा हूं (स्क्विड प्रॉक्सी के माध्यम से कुछ डीबग करने की कोशिश कर रहा हूं)।

... लेकिन आप न एक एफ़टीपी प्रॉक्सी है के रूप में ....

आप एक सॉक्स प्रॉक्सी है? यह काम कर सकता है, लेकिन मुझे नहीं पता कि .NET ऐसा कर सकता है या नहीं। अन्यथा, ईमानदार होने के लिए, मुझे लगता है कि आप अटक गए हैं! एफ़टीपी HTTP की तुलना में एक "विषम" प्रोटोकॉल है, क्योंकि इसमें एक नियंत्रण चैनल (पोर्ट 21) और एक डेटा चैनल (या एक से अधिक, एक यादृच्छिक बंदरगाह पर) है, इसलिए प्रॉक्सी के माध्यम से जाना .... मजेदार है कम से कम कहो!

+0

उसके पास एफ़टीपी प्रॉक्सी नहीं है। – VVS

+0

बगजर, उस बिट को याद किया। संपादन –

2

यदि के माध्यम से सी # के बिना फ़ाइल अपलोड करने का कोई तरीका है तो यह सी # में भी संभव होना चाहिए। ब्राउज़र या एफ़टीपी क्लाइंट के माध्यम से अपलोड कर रहा है?

एक एफ़टीपी पुस्तकालय मुझे सबसे ज्यादा पसंद .NET FTP Client library है।

+0

क्या यह HTTP प्रॉक्सी के माध्यम से सुरंग का समर्थन करता है? मैंने ओवरव्यू (http://sourceforge.net/docman/display_doc.php?docid=19518&group_id=92889) पर एक नज़र डाली थी, लेकिन प्रॉक्सी के लिए कोई संदर्भ नहीं मिला। – Alexander

+0

मुझे लगता है, अगर उपरोक्त एफ़टीपी क्लाइंट निष्क्रिय मोड में ठीक काम करता है, तो आप सुरंग टीसीपी कनेक्शन (यह जावा में कोड की लगभग 20 लाइनों) में आसानी से अपने स्रोत कोड को संशोधित कर सकता है। – Alexander

+0

@Alexander: मुझे यह मानना ​​है कि मैंने इसे केवल एक एफ़टीपी प्रॉक्सी के साथ उपयोग किया है जिसका उपयोग सामान्य FTP सर्वर की तरह किया जा सकता है। – VVS

2

जैसा कि सिकंदर कहते हैं, HTTP प्रॉक्सी मनमाने ढंग से यातायात को प्रॉक्सी कर सकती है। आपको एक एफ़टीपी क्लाइंट चाहिए जो HTTP प्रॉक्सी का उपयोग करने के लिए समर्थन करता है। अलेक्जेंडर भी सही है कि यह केवल निष्क्रिय मोड में काम करेगा।

मेरा नियोक्ता इस तरह के एक एफ़टीपी ग्राहक बेचता है, लेकिन यह एक उद्यम स्तर उपकरण है जो केवल एक बहुत बड़ी प्रणाली का हिस्सा के रूप में आता है।

मुझे यकीन है कि अन्य उपलब्ध हैं जो आपकी आवश्यकताओं के अनुरूप बेहतर होंगे।

3

एक समाधान FtpWebRequest की मोनो के कार्यान्वयन की कोशिश करना है। मैंने इसके स्रोत कोड पर एक नज़र डाली और ऐसा प्रतीत होता है कि इसे संशोधित करना आसान होगा ताकि सभी कनेक्शन (नियंत्रण और डेटा) को HTTP प्रॉक्सी के माध्यम से सुरंग किया जा सके।

आप वास्तविक FTP सर्वर की बजाय अपने HTTP प्रॉक्सी में एक टीसीपी कनेक्शन स्थापित करते हैं। फिर आप CONNECT myserver:21 HTTP/1.0 भेजकर दो सीआरएलएफ (सीआरएलएफ = \ आर \ n) भेजते हैं। यदि प्रॉक्सी को प्रमाणीकरण की आवश्यकता है, तो आपको HTTP/1.1 का उपयोग करने और प्रमाण-पत्रों के साथ प्रॉक्सी प्रमाणीकरण शीर्षलेख भी भेजने की आवश्यकता है। फिर आपको प्रतिक्रिया की पहली पंक्ति को पढ़ने की जरूरत है। यदि यह "HTTP/1.0 200" या "HTTP/1.1 200" से शुरू होता है, तो आप (शेष कोड) कनेक्शन का उपयोग जारी रख सकते हैं जैसे कि यह सीधे FTP सर्वर से कनेक्ट है।

5

हमारे Rebex FTP/SSL HTTP प्रॉक्सी का उपयोग कर सकते हैं। यह मुफ़्त नहीं है, हालांकि ...

// initialize FTP client 
Ftp client = new Ftp(); 

// setup proxy details 
client.Proxy.ProxyType = FtpProxyType.HttpConnect; 
client.Proxy.Host = proxyHostname; 
client.Proxy.Port = proxyPort; 

// add proxy username and password when needed 
client.Proxy.UserName = proxyUsername; 
client.Proxy.Password = proxyPassword; 

// connect, login 
client.Connect(hostname, port); 
client.Login(username, password); 

// do some work 
// ... 

// disconnect 
client.Disconnect(); 
+0

मुझे रेबेक्स एफ़टीपी/एफटीपीएस पुस्तकालय के साथ कई अनुभव हैं और यह मेरी सभी समस्याओं का समाधान करता है। मैं इस पुस्तकालय की सिफारिश करता हूं, क्योंकि यह मुझे बहुत समय => पैसा बचाता है। – TcKs

-1

मुझे अभी भी एक ही समस्या है।

मेरा प्राथमिक लक्ष्य एक फ़ाइल को एक FTP अपलोड करना था। और मुझे परवाह नहीं था कि मेरा ट्रैफिक प्रॉक्सी के माध्यम से जाएगा या नहीं।

तो मैं सिर्फ निर्धारित किया है FTPWebRequest.Proxy संपदा अधिकार FTPWebRequest.Create (URI) के बाद शून्य पर।

और यह काम किया। हाँ, मुझे पता है कि यह समाधान सबसे बड़ा नहीं है। और उससे अधिक, मुझे नहीं पता कि यह क्यों काम करता है। लेकिन लक्ष्य पूरा हो गया है, वैसे भी।

+0

'और मुझे कोई परवाह नहीं था कि मेरा ट्रैफिक प्रॉक्सी के माध्यम से जाएगा या नहीं।' - लेकिन क्या आपको इंटरनेट से कनेक्ट करने के लिए अपनी प्रॉक्सी से कनेक्ट करना है या यह सिर्फ वैकल्पिक था? –

2

एक FTP के लिए सामग्री अपलोड करने के लिए मानक तरीका: एक HTTP प्रॉक्सी के माध्यम से // URL पर किसी HTTP PUT अनुरोध का उपयोग कर दिया जाएगा। // URL, यह अनुरोध ग्राहक और FTP अनुरोध किया FTP सर्वर पर करने के लिए HTTP बोल: जब एफ़टीपी के साथ काम कर> एफ़टीपी प्रवेश द्वार - एक HTTP प्रॉक्सी < एक HTTP के रूप में कार्य करता है।

कम से कम विद्रूप HTTP प्रॉक्सी एफ़टीपी डाल का समर्थन करता है: // URL, यकीन नहीं क्या अन्य प्रॉक्सी करते हैं।

अधिक आम तरीका प्रॉक्सी से अधिक सुरंगों esablish से कनेक्ट विधि कोस कर रहा है। लेकिन प्रॉक्सी पर बिडरेक्शनल सुरंगों की अनुमति देने के सुरक्षा प्रभावों के कारण अक्सर इसकी अनुमति नहीं है।

2

हाय मैं एक ही मुद्दा था - संकल्प प्रॉक्सी वस्तु बनाने के लिए था और defaultcredentials निकाले जाते हैं - यह ठीक आपके आवेदन एक नेटवर्क खाते के साथ चलाया जा रहा है प्रदान की जानी चाहिए -

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 

System.Net.WebProxy proxy = System.Net.WebProxy.GetDefaultProxy(); 
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 

// set the ftpWebRequest proxy 
reqFTP.Proxy = proxy; 

इस समस्या का समाधान हो मेरे लिए।

-1

मुझे यकीन नहीं है कि सभी HTTP प्रॉक्सी एक ही तरीके से काम करते हैं, लेकिन मैं यूआरआई ftp://user:[email protected]/path पर संसाधन तक पहुंचने के लिए बस एक HTTP अनुरोध बनाकर धोखा देने में कामयाब रहा।

अफसोस की बात है, HttpWebRequest का एक उदाहरण बनाने के लिए आपको WebRequest.Create का उपयोग करना चाहिए। और यदि आप ऐसा करते हैं तो आप ftp: // schema के लिए HTTP अनुरोध नहीं बना सकते हैं।

var ctor = typeof(HttpWebRequest).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance, 
    null, 
    new Type[] { typeof(Uri), typeof(ServicePoint) }, 
    null); 
var req = (WebRequest)ctor.Invoke(new object[] { new Uri("ftp://user:[email protected]/test.txt"), null }); 
req.Proxy = new WebProxy("myproxy", 8080); 
req.Method = WebRequestMethods.Http.Put; 

using (var inStream = req.GetRequestStream()) 
{ 
    var buffer = Encoding.ASCII.GetBytes("test upload"); 
    inStream.Write(buffer, 0, buffer.Length); 
} 

using (req.GetResponse()) 
{ 
} 

तुम भी अन्य कार्यों के लिए "हटाएँ" जैसे अन्य तरीकों का उपयोग कर सकते हैं:

तो मैं एक गैर सरकारी निर्माता जो करता है कि आह्वान करने के लिए प्रतिबिंब का एक सा इस्तेमाल किया।

मेरे मामले में, यह एक आकर्षण की तरह काम करता था।

0

इन unfree अनुप्रयोगों और घटकों को डर !!! मेरा ओपन सोर्स सी # कोड है जो HTTP प्रॉक्सी के माध्यम से फ़ाइल को एफ़टीपी में अपलोड कर सकता है।

 public bool UploadFile(string localFilePath, string remoteDirectory) 
    { 
     var fileName = Path.GetFileName(localFilePath); 
     string content; 
     using (var reader = new StreamReader(localFilePath)) 
      content = reader.ReadToEnd(); 

     var proxyAuthB64Str = Convert.ToBase64String(Encoding.ASCII.GetBytes(_proxyUserName + ":" + _proxyPassword)); 
     var sendStr = "PUT ftp://" + _ftpLogin + ":" + _ftpPassword 
      + "@" + _ftpHost + remoteDirectory + fileName + " HTTP/1.1\n" 
      + "Host: " + _ftpHost + "\n" 
      + "User-Agent: Mozilla/4.0 (compatible; Eradicator; dotNetClient)\n" + "Proxy-Authorization: Basic " + proxyAuthB64Str + "\n" 
      + "Content-Type: application/octet-stream\n" 
      + "Content-Length: " + content.Length + "\n" 
      + "Connection: close\n\n" + content; 

     var sendBytes = Encoding.ASCII.GetBytes(sendStr); 

     using (var proxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      proxySocket.Connect(_proxyHost, _proxyPort); 
      if (!proxySocket.Connected) 
       throw new SocketException(); 
      proxySocket.Send(sendBytes); 

      const int recvSize = 65536; 
      var recvBytes = new byte[recvSize]; 
      proxySocket.Receive(recvBytes, recvSize, SocketFlags.Partial); 

      var responseFirstLine = new string(Encoding.ASCII.GetChars(recvBytes)).Split("\n".ToCharArray()).Take(1).ElementAt(0); 
      var httpResponseCode = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$1"); 
      var httpResponseDescription = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$2"); 
      return httpResponseCode.StartsWith("2"); 
     } 
     return false; 
    } 
3

.NET फ़्रेमवर्क 4.6.3 के रूप में, FtpWebRequest अभी भी cannot upload files over HTTP proxy

यदि निर्दिष्ट प्रॉक्सी एक HTTP प्रॉक्सी है, तो केवल डाउनलोडफाइल, ListDirectory, और ListDirectoryDetails आदेश समर्थित हैं।

तो या तो आपको स्वयं को अपलोड करने, या किसी तृतीय पक्ष एफ़टीपी लाइब्रेरी का उपयोग करने की आवश्यकता है।


WinSCP .NET assembly साथ उदाहरण के लिए, आप का उपयोग कर सकते हैं:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "user", 
    Password = "mypassword", 
}; 

// Configure proxy 
sessionOptions.AddRawSettings("ProxyMethod", "3"); 
sessionOptions.AddRawSettings("ProxyHost", "proxy"); 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Upload file 
    string localFilePath = @"C:\path\file.txt"; 
    string pathUpload = "/file.txt"; 
    session.PutFiles(localFilePath, pathUpload).Check(); 
} 

विकल्पों के लिए tje SessionOptions.AddRawSettings के लिए, raw settings देखते हैं।

आपके लिए WinSCP GUI generate C# FTP code template आसान है।

ध्यान दें कि WinSCP .NET असेंबली मूल .NET लाइब्रेरी नहीं है। यह कंसोल एप्लिकेशन पर एक पतला .NET wrapper है।

(मैं WinSCP के लेखक हूँ)

+0

WinSCP के लेखक के लिए उपरोक्त। – zoidbeck

संबंधित मुद्दे