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);
}
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 fluxVoici 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
Vous devez vous connecter pour publier un commentaire.
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. 🙁 (Je voulais les fonctionnalités à la fois laMultipartFileStreamProvider
etMultipartFormDataStreamProvider
roulé dans un MultipartStreamProvider, sans la sauvegarde automatique de la partie).Cela peut aider; voici un écrit par l'un des développeurs d'API Web, et cette du même développeur.
Actuellement, il est en
System.Net.Formatting.dll
au sein de la Microsoft.AspNet.WebApi.Client package NuGet. Voici la le dernier code source (il n'a pas été changé en près d'un an).Merci pour cette Sameer 😉
Yess !!.. ça fonctionne 🙂 seulement gênant, c'est que je ne peut pas obtenir le reste de l'formdata 🙁 utilisé cette avant ----> objet privé GetFormData<T>(MultipartFormDataStreamProvider result) { if (result.FormData.HasKeys()) { var unescapedFormData = Uri.UnescapeDataString(le résultat.FormData .GetValues(0).FirstOrDefault() ?? Chaîne de caractères.Vide); if (!Chaîne de caractères.IsNullOrEmpty(unescapedFormData)) return JsonConvert.DeserializeObject<T>(unescapedFormData); } return null; }
suppose que c'était votre question ? 😉
OriginalL'auteur Sameer Singh
Salut je voulais juste poster ma réponse donc si quelqu'un rencontre le même problème, ils peuvent trouver une solution ici.
ici
J'ai utilisé MultipartMemoryStreamProvider et a obtenu tous les détails comme les nom de fichier et le type de fichier à partir de l'en-tête de contenu.
Espérons que cela aide quelqu'un.
OriginalL'auteur Abhay Garg