J'ai une application Angular, écrite en Typescript, avec un backend ASP.Net Web Api. J'essaie d'utiliser la directive ng-file-upload (voir ce link pour plus de détails) pour télécharger un fichier image.Fin prévue du flux multi-parties MIME. Le message multi-parties MIME n'est pas complet
Je reçois une exception dans mon Web API méthode post:
"Fin inattendue du flux MIME multipart message MIME multipart est pas complète."
J'ai fait mes recherches et trouvé des problèmes similaires here - J'ai essayé d'implémenter la réponse de Landuber Kassa mais sans succès.
Aussi this bien que mon projet ne soit pas MVC et en tout cas cela ne fonctionnait pas. Je suis fraîche d'idées et apprécierais les pensées de la communauté. Je suis heureux d'envisager d'autres alternatives si je peux être indiqué dans la bonne direction.
Ash
My .Net méthode Post (mise en œuvre de l'idée de Landuber Kassa):
[RoutePrefix("BeaufortAppStore/api/Image")]
public class ImageController : ApiController
{
#region Methods
#region Posts
[Route("UploadImage")]
[HttpPost]
public async Task<IHttpActionResult> UploadImage()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new MultipartMemoryStreamProvider();
Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
MemoryStream tempStream = new MemoryStream();
reqStream.CopyTo(tempStream);
tempStream.Seek(0, SeekOrigin.End);
StreamWriter writer = new StreamWriter(tempStream);
writer.WriteLine();
writer.Flush();
tempStream.Position = 0;
StreamContent streamContent = new StreamContent(tempStream);
foreach (var header in Request.Content.Headers)
{
streamContent.Headers.Add(header.Key, header.Value);
}
// Read the form data and return an async task.
await streamContent.ReadAsMultipartAsync(provider); // FAILS AT THIS POINT
foreach (var file in provider.Contents)
{
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
var buffer = await file.ReadAsByteArrayAsync();
//Do whatever you want with filename and its binary data.
}
return Ok();
}
#endregion
#endregion
Ma méthode de commande angulaire:
public upload(): void {
//Create config used in ng-file-upload
var config: IFileUploadConfigFile = {
data: this.file, url: "BeaufortAppStore/api/Image/UploadImage/", method: "POST" };
this._dataService.uploadImage(config).then((result: any) => {
this.thumbnail = result.data;
});
}
Mon point de vue angulaire (vue partielle d'une directive) :
<div class="form-group">
<label for="file" class="control-label col-xs-2">Choose a file</label>
<input id="file" type="file" name="file" class="form-control" ngf-select ngf-pattern="'image/*'"
ng-model="vm.file" />
<img style="width:100px;" ngf-thumbnail="thumbnail || '/thumb.jpg'" />
<button type="submit" ng-click="vm.upload()">Upload</button>
Merci pour la réponse rapide. Avant de l'essayer, pouvez-vous expliquer un peu ce qui est différent dans cette approche? –
Fondamentalement, il s'agit d'une façon testée au combat de récupérer un contenu de téléchargement mutipart à partir d'un téléchargement angulaire ... il prend le format correct de la this.Request et avec une tâche asynchrone, il génère un nom (avec un guid aléatoire pour ne pas écraser ou aller en exception si quelqu'un télécharge la même image avec le même nom d'autre) –
Je vais vous montrer aussi le contrôleur (Angular) et le html si vous en avez besoin ..et soyez sûr de votre méthode de publication (vérifiez sur la console en chrome .. si le format est correct .. si ce n'est pas essayer d'écraser l'en-tête de la demande) –