मुझे लगता है कि आप आवश्यकता से अपने आप पर कठिन बातें कर रहे हैं ASP.Net की अंतर्निहित सुविधाओं का उपयोग करने के बजाय HttpListener
। लेकिन अगर आपको ऐसा करना चाहिए तो यहां कुछ नमूना कोड है। नोट: 1) मुझे लगता है कि आप enctype="multipart/form-data"
का उपयोग अपने <form>
पर कर रहे हैं। 2) इस कोड को एक फॉर्म के साथ इस्तेमाल करने के लिए डिज़ाइन किया गया है जिसमें केवल <input type="file" />
है, यदि आप अन्य फ़ील्ड या एकाधिक फाइलें पोस्ट करना चाहते हैं तो आपको कोड बदलना होगा। 3) यह अवधारणा/उदाहरण का सबूत होने के लिए है, इसमें बग हो सकती है, और यह विशेष रूप से लचीला नहीं है।
static void Main(string[] args)
{
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/ListenerTest/");
listener.Start();
HttpListenerContext context = listener.GetContext();
SaveFile(context.Request.ContentEncoding, GetBoundary(context.Request.ContentType), context.Request.InputStream);
context.Response.StatusCode = 200;
context.Response.ContentType = "text/html";
using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF8))
writer.WriteLine("File Uploaded");
context.Response.Close();
listener.Stop();
}
private static String GetBoundary(String ctype)
{
return "--" + ctype.Split(';')[1].Split('=')[1];
}
private static void SaveFile(Encoding enc, String boundary, Stream input)
{
Byte[] boundaryBytes = enc.GetBytes(boundary);
Int32 boundaryLen = boundaryBytes.Length;
using (FileStream output = new FileStream("data", FileMode.Create, FileAccess.Write))
{
Byte[] buffer = new Byte[1024];
Int32 len = input.Read(buffer, 0, 1024);
Int32 startPos = -1;
// Find start boundary
while (true)
{
if (len == 0)
{
throw new Exception("Start Boundaray Not Found");
}
startPos = IndexOf(buffer, len, boundaryBytes);
if (startPos >= 0)
{
break;
}
else
{
Array.Copy(buffer, len - boundaryLen, buffer, 0, boundaryLen);
len = input.Read(buffer, boundaryLen, 1024 - boundaryLen);
}
}
// Skip four lines (Boundary, Content-Disposition, Content-Type, and a blank)
for (Int32 i = 0; i < 4; i++)
{
while (true)
{
if (len == 0)
{
throw new Exception("Preamble not Found.");
}
startPos = Array.IndexOf(buffer, enc.GetBytes("\n")[0], startPos);
if (startPos >= 0)
{
startPos++;
break;
}
else
{
len = input.Read(buffer, 0, 1024);
}
}
}
Array.Copy(buffer, startPos, buffer, 0, len - startPos);
len = len - startPos;
while (true)
{
Int32 endPos = IndexOf(buffer, len, boundaryBytes);
if (endPos >= 0)
{
if (endPos > 0) output.Write(buffer, 0, endPos-2);
break;
}
else if (len <= boundaryLen)
{
throw new Exception("End Boundaray Not Found");
}
else
{
output.Write(buffer, 0, len - boundaryLen);
Array.Copy(buffer, len - boundaryLen, buffer, 0, boundaryLen);
len = input.Read(buffer, boundaryLen, 1024 - boundaryLen) + boundaryLen;
}
}
}
}
private static Int32 IndexOf(Byte[] buffer, Int32 len, Byte[] boundaryBytes)
{
for (Int32 i = 0; i <= len - boundaryBytes.Length; i++)
{
Boolean match = true;
for (Int32 j = 0; j < boundaryBytes.Length && match; j++)
{
match = buffer[i + j] == boundaryBytes[j];
}
if (match)
{
return i;
}
}
return -1;
}
मदद करने के लिए आप को बेहतर समझते हैं क्या इसके बाद के संस्करण कोड कर रहा है, यहाँ क्या HTTP POST के शरीर की तरह लग रहा है:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9lcB0OZVXSqZLbmv
------WebKitFormBoundary9lcB0OZVXSqZLbmv
Content-Disposition: form-data; name="my_file"; filename="Test.txt"
Content-Type: text/plain
Test
------WebKitFormBoundary9lcB0OZVXSqZLbmv--
मैं अप्रासंगिक हेडर बाहर छोड़ दिया गया है। जैसा कि आप देख सकते हैं, आपको प्रारंभिक और समापन सीमा अनुक्रमों को खोजने के लिए स्कैन करके शरीर को पार्स करने की आवश्यकता है, और उप फ़ाइल को अपनी फ़ाइल की सामग्री से पहले छोड़ दें। दुर्भाग्य से आप बाइनरी डेटा की संभावना के कारण StreamReader का उपयोग नहीं कर सकते हैं। यह भी दुर्भाग्यपूर्ण है कि प्रति फ़ाइल सामग्री-लंबाई नहीं है (अनुरोध के लिए सामग्री-लंबाई शीर्षलेख सीमाओं, उप-शीर्षकों और रिक्ति सहित शरीर की कुल लंबाई निर्दिष्ट करता है।
मैं आप अपने वेब के रूप में enctype = "बहुखण्डीय/फार्म-डेटा" का उपयोग कर रहे इसे ले? यदि ऐसा है तो ऐसा लगता है कि आप जिस तरह से oversimplifying रहे हैं आप सामग्री को पढ़ते हैं। –