asp.net web api文件上传而不保存

时间:2013-08-07 20:25:38

标签: file-upload cordova asp.net-web-api

好的,所以我正在编写一项服务,通过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;
}

我已经在那里放了各种响应,所以我可以看到函数的位置。现在它总是返回“已输入”,这意味着它甚至没有读取请求的内容,最终游戏是我抓取文件对象,将其转换为图像然后基于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;
}

1 个答案:

答案 0 :(得分:1)

ContinueWith内的块也异步运行(如果你查看ContinueWith的签名,你会看到它也返回Task)。因此,使用上面的代码,基本上你可以在任何有机会执行之前返回。

尝试做:

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

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

希望有所帮助!