[W8 Xaml/ASP.NET Web Api] error uploading file

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 20:53
Ik probeer vanuit een W8 app de profile picture te uploaden met onderstaande code:
Visual Basic .NET:
1
2
3
4
5
6
Dim image As Windows.Storage.IStorageFile = Windows.System.UserProfile.UserInformation.GetAccountPicture(Windows.System.UserProfile.AccountPictureKind.LargeImage)
Dim uri As Uri = New Uri(Variable.WebApiUri & "UploadUserImage")
Dim uploader As New BackgroundUploader()
uploader.SetRequestHeader("Filename", image.Name)
Dim upload As UploadOperation = uploader.CreateUpload(uri, image)
Await upload.StartAsync

De Web Api bevat deze code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Public Async Function PostFile() As Task(Of HttpResponseMessage)
    ' Check if the request contains multipart/form-data. 
    If Not Request.Content.IsMimeMultipartContent() Then
        Throw New HttpResponseException(HttpStatusCode.UnsupportedMediaType)
    End If
    Dim root As String = HttpContext.Current.Server.MapPath("~/App_Data")
    Dim provider = New MultipartFormDataStreamProvider(root)
    Try
        Dim sb As New StringBuilder()
        ' Holds the response body 
        ' Read the form data and return an async task. 
        Await Request.Content.ReadAsMultipartAsync(provider)
        ' This illustrates how to get the form data. 
        For Each key In provider.FormData.AllKeys
            For Each Vall In provider.FormData.GetValues(key)
                sb.Append(String.Format("{0}: {1}" & vbLf, key, Vall))
            Next
        Next
        ' This illustrates how to get the file names for uploaded files. 
        For Each file In provider.FileData
            Dim fileInfo As New FileInfo(file.LocalFileName)
            sb.Append(String.Format("Uploaded file: {0} ({1} bytes)" & vbLf, fileInfo.Name, fileInfo.Length))
        Next
        Return New HttpResponseMessage() With { _
            .Content = New StringContent(sb.ToString()) _
            }
    Catch e As System.Exception
        Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e)
    End Try
End Function

De Web Api constateerd dat de request niet multipart is en genereerd een 415 html error.

Ik heb beide stukken code van een voorbeeld van Microsoft overgenomen, en op internet kom ik ook steeds dezelfde code tegen. Maar bij mij lukt het niet om een file te uploaden. Ik heb het vermoeden dat IIS waar ik de Web Api op host misschien het een en ander in de war schopt, maar ik kom er niet uit.

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

"Filename" is geen HTTP-header, waarschijnlijk bedoel je Content-Disposition die je instelt op attachment; filename=$filename.

Daarnaast zul je, als je dat verwacht, moeten opzoeken of de BackgroundUploader altijd als multipart/form-data uploadt. Je kunt dit bijvoorbeeld controleren met Fiddler.

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 20:53
CodeCaster schreef op maandag 19 november 2012 @ 10:37:
"Filename" is geen HTTP-header, waarschijnlijk bedoel je Content-Disposition die je instelt op attachment; filename=$filename.

Daarnaast zul je, als je dat verwacht, moeten opzoeken of de BackgroundUploader altijd als multipart/form-data uploadt. Je kunt dit bijvoorbeeld controleren met Fiddler.
Ik had puur de voorbeelden die ik op internet kon vinden overgenomen, en die voorbeelden zijn ook steeds weer hetzelfde, op totaal verschillende websites.

Maar toch de volgende opties geprobeerd:
Visual Basic .NET:
1
2
3
4
5
uploader.SetRequestHeader("Content-Disposition", "attachment; filename=""" & image.Name & """")

en

uploader.SetRequestHeader("Content-Type", "multipart/form-data")

Geen van de opties gaf verschil, behalve als ik achter Content-Disposition een : plaatste, dan kreeg ik de foutmelding dat er verkeerde tekens in de header worden gebruikt.

Aan de backgrounduploader kan je verder niets opgeven, behalve de methode (post, get enz.) Die staat standaard op post.

Daarom vind ik het vreemd dat alle voorbeelden op internet, speciaal voor het uploaden van afbeeldingen, wel werken zoals in mijn eerste post.

Ik zal eens kijken of ik de header op 1 of andere manier kan onderscheppen en uitlezen. Wordt lastig met een W8 app...

Edit:

upload.SourceFile.ContentType geeft image/jpeg, dus dat is in ieder geval goed.

Opgelost:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Dim parts As New List(Of BackgroundTransferContentPart)()
Dim part As New BackgroundTransferContentPart("File" & image.Name)
part.SetFile(image)
parts.Add(part)
Dim uri As Uri = New Uri(Variable.WebApiUri & "UploadUserImage")
Dim uploader As New BackgroundUploader()
Dim upload As UploadOperation = Await uploader.CreateUploadAsync(uri, parts)
uploader.SetRequestHeader("Filename", image.Name)
Await upload.StartAsync

[ Voor 14% gewijzigd door Swerfer op 19-11-2012 18:40 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com