COST метод передачи файлов через сокет - PullRequest
0 голосов
/ 10 января 2012

То, что я пытаюсь сделать, - это написать простой HTTP-демон на c #. Мне удалось поддержать метод GET, но метод POST кажется сложнее. Я должен проанализировать составные форм-данные, а также сохранить файлы на сервере, которые были отправлены через FILE Upload.

Что я на самом деле делаю:

  1. Проверьте, содержит ли подстрока SocketBuffer метод POST
  2. Ищем граничный тег и извлекая его
  3. Чтение заголовка из граничного тега в граничный тег сохраняя подстроку между этими двумя тегами в массиве.
  4. Анализ каждого поля массива - проверка, содержит ли оно какие-либо данные, быть сохраненным на диске.
  5. Если он содержит данные: чтение "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). Когда я пытаюсь загрузить любые другие данные, кроме текстовых файлов, файлы не полностью декодируются и не могут быть использованы. Есть идеи как это исправить?

...