То, что я пытаюсь сделать, - это написать простой HTTP-демон на c #. Мне удалось поддержать метод GET, но метод POST кажется сложнее. Я должен проанализировать составные форм-данные, а также сохранить файлы на сервере, которые были отправлены через FILE Upload.
Что я на самом деле делаю:
- Проверьте, содержит ли подстрока SocketBuffer метод POST
- Ищем граничный тег
и извлекая его
- Чтение заголовка из граничного тега в граничный тег
сохраняя подстроку между этими двумя тегами в массиве.
- Анализ каждого поля массива - проверка, содержит ли оно какие-либо данные,
быть сохраненным на диске.
- Если он содержит данные: чтение
"content-disposition", "filename", "content-type" и данные
сам по себе.
публичная строка parse_boundary (граница строки)
{
if (содержит_данные (границы))
{
get_content_disposition (граница);
get_filename (граница);
get_contenttype (граница);
get_binarydata (граница);
}
еще
{
Console.WriteLine («Нет данных!»);
}
вернуть "";
}
public string get_content_disposition(string substring)
{
int first, last;
first = substring.IndexOf("Content-Disposition") + "Content-Disposition:".Length;
last = substring.IndexOf("Content-Type:");
string content_disposition = substring.Substring(first, (last - first));
content_disposition = content_disposition.Replace("\t", "").Replace("\r", "").Replace("\n","");
#if DEBUG_MODE
Console.WriteLine("DEBUG content_disposition: " + content_disposition);
#endif
return content_disposition;
}
public string get_filename(string substring)
{
int first, last;
first = substring.IndexOf("filename=\"") + "filename=\"".Length;
last = substring.IndexOf("\"", first);
string filename = substring.Substring(first, (last - first));
#if DEBUG_MODE
Console.WriteLine("DEBUG Filename: " + filename);
#endif
return filename;
}
public string get_contenttype(string substring)
{
int first, last;
first = substring.IndexOf("Content-Type:", substring.IndexOf("Content-Disposition") + "Content_Type:".Length);
last = substring.IndexOf("\n", first);
string content_type = substring.Substring(first, (last - first));
content_type = content_type.Trim();
#if DEBUG_MODE
Console.WriteLine("DEBUG Content-Type: " + content_type);
#endif
return content_type;
}
public void get_binarydata(string substring)
{
int first, second, last;
first = substring.IndexOf("Content-Type:", substring.IndexOf("Content-Disposition") + "Content_Type:".Length);
second = substring.IndexOf("\n", first);
last = substring.Length;
string tobinary = substring.Substring(second, (last - second));
//tobinary = tobinary.TrimStart();
#if DEBUG_MODE
Console.WriteLine("DEBUG get_binarydata: " + tobinary);
#endif
byte[] encoded_binary = System.Text.Encoding.UTF8.GetBytes(tobinary);
ByteArrayToFile(get_filename(substring), encoded_binary);
}
public bool ByteArrayToFile(string _Filename, byte[] _ByteArray)
{
try
{
System.IO.FileStream _FileStream = new System.IO.FileStream(_Filename, System.IO.FileMode.Create, System.IO.FileAccess.Write);
_FileStream.Write(_ByteArray, 0, _ByteArray.Length);
_FileStream.Close();
return true;
}
catch (Exception _Exception)
{
Console.WriteLine("Exeception caught in process: {0}", _Exception.ToString());
}
return false;
}
public bool contains_data(string boundary)
{
int idx = boundary.IndexOf("Content-Type:");
if (idx == -1)
{
return false;
}
else
{
return true;
}
}
Я знаю, что должно быть больше блоков try / catch, но это только экспериментально, а не для производственного использования. Я также должен упомянуть, что мой BufferSize равен [1024 * MAX_UPLOAD_SIZE]
(который в настоящее время установлен на 2 МБ).
Теперь к моей проблеме: когда я пытаюсь загрузить изображение с помощью файла, мой файл изображения ВСЕГДА имеет размер 2 МБ (BufferSize). Когда я пытаюсь загрузить любые другие данные, кроме текстовых файлов, файлы не полностью декодируются и не могут быть использованы. Есть идеи как это исправить?