1

好的,所以我正在编写一个服务来通过 phonegap 从 iPhone 应用程序接收文件上传。他们向我发送了一个文件,我试图获取实际文件而不将其保存到任何类型的文件系统中。目前这就是我所拥有的

[HttpPost]
public string processRequest()
{
    string ext = "Entered";
    Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()).ContinueWith((tsk) =>
    {
        ext = "Request";
        MultipartMemoryStreamProvider prvdr = tsk.Result;

        foreach (HttpContent ctnt in prvdr.Contents)
        {
            ext = "Foreach";
            // You would get hold of the inner memory stream here
            Stream stream = ctnt.ReadAsStreamAsync().Result;
            if (stream == null)
            {
                ext = "Null Stream";
            }
            Image img = Image.FromStream(stream);
            if (ImageFormat.Jpeg.Equals(img.RawFormat))
            {
                ext = "jpeg";
            }
            else if (ImageFormat.Png.Equals(img.RawFormat))
            {
                ext = "Png";
            }
            else if (ImageFormat.Gif.Equals(img.RawFormat))
            {
                ext = "Gif";
            }
            // do something witht his stream now
        }
    });
    return ext;
}

我已经在那里放了各种响应,所以我可以看到函数的位置。现在它总是返回“Entered”,这意味着它甚至没有读取请求的内容,最终游戏是让我抓取文件对象,将其转换为图像,然后转换为 base 64。任何方向都将不胜感激。请记住,我想在没有任何文件系统的情况下执行此操作,因此没有涉及将路径映射到服务器文件夹的解决方案。

好的,稍微更新一下,我已经根据我的第一个响应编辑了我的代码,至少它现在尝试执行,但它只是无限地卡在代码中。这发生在 ReadAsMultipartAsync 函数期间

[HttpPost]
public string processRequest()
{
    string ext = "Entered";
    Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider()).ContinueWith((tsk) =>
    {
        ext = "Request";
        MultipartMemoryStreamProvider prvdr = tsk.Result;

        foreach (HttpContent ctnt in prvdr.Contents)
        {
            ext = "Foreach";
            // You would get hold of the inner memory stream here
            Stream stream = ctnt.ReadAsStreamAsync().Result;
            if (stream == null)
            {
                ext = "Null Stream";
            }
            Image img = Image.FromStream(stream);
            if (ImageFormat.Jpeg.Equals(img.RawFormat))
            {
                ext = "jpeg";
            }
            else if (ImageFormat.Png.Equals(img.RawFormat))
            {
                ext = "Png";
            }
            else if (ImageFormat.Gif.Equals(img.RawFormat))
            {
                ext = "Gif";
            }
            // do something witht his stream now
        }
    }).Wait();
    return ext;
}
4

1 回答 1

1

里面的块ContinueWith也是异步运行的(如果你查看 ContinueWith 的签名,你会看到它也返回了 a Task)。因此,使用上面的代码,基本上你在其中任何一个有机会执行之前就返回了。

尝试做:

Request.Content.ReadAsMultipartAsync().ContinueWith(...).Wait();

另外,不确定您是否需要费心去做Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider());我相信Request.Content.ReadAsMultipartAsync()应该足够了。

希望有帮助!

于 2013-08-07T20:44:45.313 回答