Comment obtenir le flux de données pour un fichier en plusieurs parties dans webapi télécharger?

J'ai besoin de télécharger un fichier à l'aide de Flux (Azure Blobstorage), et juste ne peut pas trouver comment obtenir le flux de l'objet lui-même. Voir le code ci-dessous.

Je suis nouveau sur le WebAPI et les ont utilisés quelques exemples. Je suis de récupérer les fichiers et filedata, mais ce n'est pas le type correct pour mes méthodes à télécharger. Donc, j'ai besoin d'obtenir ou de le convertir en un Flux normal, ce qui semble un peu dur en ce moment 🙂

Je sais que j'ai besoin d'utiliser ReadAsStreamAsync().Result d'une certaine façon, mais il se bloque dans la boucle foreach depuis que je suis deux de fournisseur.Contenu (le premier me semble bon, la deuxième ne fonctionne pas).

 [System.Web.Http.HttpPost]
public async Task<HttpResponseMessage> Upload()
{
if (!Request.Content.IsMimeMultipartContent())
{
this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
}
var provider = GetMultipartProvider();
var result = await Request.Content.ReadAsMultipartAsync(provider);
//On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5"
//so this is how you can get the original file name
var originalFileName = GetDeserializedFileName(result.FileData.First());
//uploadedFileInfo object will give you some additional stuff like file length,
//creation time, directory name, a few filesystem methods etc..
var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName);
//Remove this line as well as GetFormData method if you're not
//sending any form data with your upload request
var fileUploadObj = GetFormData<UploadDataModel>(result);
Stream filestream = null;
using (Stream stream = new MemoryStream())
{
foreach (HttpContent content in provider.Contents)
{
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, content.ReadAsStreamAsync().Result);
stream.Position = 0;
filestream = stream;
}
}
var storage = new StorageServices();
storage.UploadBlob(filestream, originalFileName);**strong text**
private MultipartFormDataStreamProvider GetMultipartProvider()
{
var uploadFolder = "~/App_Data/Tmp/FileUploads"; //you could put this to web.config
var root = HttpContext.Current.Server.MapPath(uploadFolder);
Directory.CreateDirectory(root);
return new MultipartFormDataStreamProvider(root);
}
1. Ce n' GetMultipartProvider() retour? 2. Je crois que vous pouvez obtenir le chemin d'accès au fichier de l'auto-magiquement fichier enregistré auprès du fournisseur et de l'utilisation de l'habitude de System.IO.File ou System.IO.FileInfo classes pour récupérer le flux
Voici la méthode 🙂 privé MultipartFormDataStreamProvider GetMultipartProvider() { var uploadFolder = "~/App_Data/Tmp/FileUploads"; // vous pouvez mettre cela sur le web.config var root = HttpContext.Actuel.Serveur.MapPath(uploadFolder); Répertoire.CreateDirectory(racine); return new MultipartFormDataStreamProvider(racine); }
Puis-je obtenir le fichier à partir d'ici ? Fondamentalement, je n'ai pas besoin de le stocker sur le disque.. je n'ai besoin que le flux pour le téléchargement sur azure blob storage 🙂 des idées ?
C'est identique à un dilemme, j'ai eu il y a quelques mois (la capture de l'upload cours d'eau avant de le MultipartStreamProvider a pris le dessus et l'auto-magiquement enregistré le flux dans un fichier). La recommandation a été hériter de cette classe et de remplacer les méthodes ... mais cela ne fonctionne pas dans mon cas. 🙁 Cela peut aider; voici l'un écrit par un des Web développeurs d'API.
Il y a aussi ceci à partir du même développeur.

OriginalL'auteur Terje Nygård | 2014-07-17