Загрузка файла из Flex в WCF Проблемы с REST Stream (как декодировать многочастную форму в REST WS) - PullRequest
4 голосов
/ 24 марта 2011

Система представляет собой приложение Flex, взаимодействующее с веб-службой WCF REST.Я пытаюсь загрузить файл из приложения Flex на сервер и сталкиваюсь с некоторыми проблемами, которые, я надеюсь, кто-то здесь сможет помочь.Я использую FileReference в приложении Flex для просмотра и загрузки файла, как определено здесь:

http://blog.flexexamples.com/2007/09/21/uploading-files-in-flex-using-the-filereference-class/

Затем я получаю файл в виде потока (отображается как System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream в отладчике) в веб-службе REST WCF (с использованием типа проекта службы REST WCF 4)

[WebInvoke(Method = "POST", UriTemplate = "_test/upload")]
public void UploadImage(Stream data)
{
    // TODO: just hardcode filename for now
    var filepath = HttpContext.Current.Server.MapPath(@"~\_test\testfile.txt");
    using (Stream file = File.OpenWrite(filepath))
    {
        CopyStream(data, file);
    }
}
private static void CopyStream(Stream input, Stream output)
{
    var buffer = new byte[8 * 1024];
    int len;
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, len);
    }
}

Примечание: метод CopyStream, используемый в этом сообщении: Как мнесохранить поток в файл в C #?

Файл сохраняется без проблем.У меня проблема в том, что файл содержит больше информации, чем мне бы хотелось.Вот содержимое сохраненного файла (где исходный файл содержал только «ЭТО СОДЕРЖАНИЕ ФАЙЛА»):

------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Filename"

testfile.txt
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Filedata"; filename="testfile.txt"
Content-Type: application/octet-stream

THIS IS THE CONTENT OF THE FILE
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Upload"

Submit Query
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2--

Содержимое выглядит точно так же, как описано в документации Adobe: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html

Есть ли в C # какие-либо средства для получения содержимого файла из Stream?

РЕДАКТИРОВАТЬ (3/24 20:15) : то, что отправляет приложение Flex, - это составная форма POST.Как можно декодировать данные составного тела, представленные параметром Stream, и вырезать части составного тела?

РЕДАКТИРОВАТЬ (3/25 10:00) : еще несколько сообщений переполнения стекасвязанные с этим:
Служба WCF для приема многосоставных данных / данных формы в формате
Отправка многостраничных данных / данных формы в службу REST WCF: действие изменяется

РЕДАКТИРОВАТЬ (3/25 10:45 утра) : Найден многочастный синтаксический анализатор, который работает очень хорошо:
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 20 января 2012

Я с открытым исходным кодом C # Http анализатор здесь .

Это немного более гибко, чем другой, упомянутый в CodePlex, поскольку вы можете использовать его как для Multipart, так и для не Multipart form-data, а также для других параметров формы, отформатированных в объекте Dictionary.

Это можно использовать следующим образом:

без многочастного

public void Login(Stream stream)
{
    string username = null;
    string password = null;

    HttpContentParser parser = new HttpContentParser(data);
    if (parser.Success)
    {
        username = HttpUtility.UrlDecode(parser.Parameters["username"]);
        password = HttpUtility.UrlDecode(parser.Parameters["password"]);
    }
}

многочастному

public void Upload(Stream stream)
{
    HttpMultipartParser parser = new HttpMultipartParser(data, "image");

    if (parser.Success)
    {
        string user = HttpUtility.UrlDecode(parser.Parameters["user"]);
        string title = HttpUtility.UrlDecode(parser.Parameters["title"]);

        // Save the file somewhere
        File.WriteAllBytes(FILE_PATH + title + FILE_EXT, parser.FileContents);
    }
}
5 голосов
/ 25 марта 2011

Спасибо Энтони за http://antscode.blogspot.com/ за многочастный парсер, который отлично работает (для изображений, текстовых файлов и т. Д.)

http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html

1 голос
/ 30 января 2013

У меня были некоторые проблемы с синтаксическим анализатором, которые основаны на синтаксическом анализе строк, особенно с большими файлами. Я обнаружил, что у него не хватает памяти и не удается проанализировать двоичные данные.

Чтобы справиться с этими проблемами, я открыл свою собственную попытку C # multipart / form-parser здесь

Смотрите мой ответ здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...