2013-08-07 5 views
1

Итак, я пишу службу для загрузки файлов из приложения iPhone через телефонную защелку. Они отправляют мне файл, и я пытаюсь захватить фактический файл, не сохраняя его в любой тип файловой системы. В настоящее время это то, что яasp.net web api загрузка файла без сохранения

[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

Блок внутри ContinueWith также работает асинхронно (если смотреть на подпись для ContinueWith, вы увидите, что она возвращает Task, а). Таким образом, с вышеуказанным кодом, по существу, вы возвращаетесь до того, как любой из них имеет возможность выполнить.

Try делание:

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

Кроме того, не уверен, что вам нужно пойти на неприятности делать Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()); Я считаю, что Request.Content.ReadAsMultipartAsync() должно быть достаточно.

Надеюсь, что это поможет!

Смежные вопросы