Prestashop - невозможно загрузить новый графический продукт с помощью веб-сервиса prestashop 1.6

Я пытаюсь загрузить новое изображение для продукта с веб-сервисом prestashop через приложение vb .net, но получаю следующее сообщение об ошибке:

"Не удалось сохранить это изображение".

URL-адрес, используемый для загрузки изображения, выглядит следующим образом: http://localhost/prestashop/api/images/products/1 И исходный код функции, которая делает запрос, таков:

Public Sub executeAddImage(ByVal resource As String, ByVal id As String, ByVal imageToAdd As Image)
    Dim response As String = Nothing

    Try
        Dim ms As New MemoryStream()
        imageToAdd.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
        Dim byteArray As Byte() = ms.ToArray()

        Dim requestUrl As String = Me.WebServiceURL & "/" & resource & "/" & id
        MsgBox(requestUrl)
        Dim webRequest As HttpWebRequest = DirectCast(System.Net.WebRequest.Create(requestUrl), HttpWebRequest)
        webRequest.Method = WebServicePrestashop.CRUDMethod.Create
        'webRequest.ContentType = "image/jpeg"
        webRequest.ContentType = "application/x-www-form-urlencoded"
        webRequest.Credentials = New NetworkCredential(Me.LoginName, WebServicePrestashop._password)
        webRequest.ContentLength = byteArray.Length
        MsgBox(byteArray.Length)
        ' Get the request stream
        Using dataStream As Stream = webRequest.GetRequestStream()
            dataStream.Write(byteArray, 0, byteArray.Length)
        End Using

        ' Get the response
        Using webResponse As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse)
            If webResponse.StatusCode = HttpStatusCode.OK Then
                Using reader As New StreamReader(webResponse.GetResponseStream(), Encoding.UTF8)
                    Dim imageNew As Image = Image.FromStream(webResponse.GetResponseStream())
                End Using
            End If
        End Using

    Catch ex As WebException
        MsgBox(ex.Message.ToString())
        Dim reader As New StreamReader(ex.Response.GetResponseStream)
        MsgBox(reader.ReadToEnd)
    End Try
End Sub

Я использую метод HTTP POST, а содержимое POST — это двоичное содержимое нового изображения.

Как я могу это исправить?


person edkalel    schedule 09.09.2014    source источник


Ответы (1)


Вот решение. Я думаю, что ключ в том, что я должен написать тело веб-запроса, программно добавляя к потоку веб-запроса границу (в формате двоичного массива), цепочку Content-Type (в формате двоичного массива) и содержимое изображения для загрузки (в формате двоичного массива).

Public Sub executeAddImage(ByVal resource As String, ByVal id As String, ByVal imageToAdd As Byte())
    Dim response As String = Nothing


    Try
        Dim requestUrl As String = "urlShop" & "/api/" & resource & "/" & id
        MsgBox(requestUrl)
        Dim webRequest As HttpWebRequest = DirectCast(System.Net.WebRequest.Create(requestUrl), HttpWebRequest)
        webRequest.KeepAlive = True
        webRequest.Credentials = New NetworkCredential(Me.LoginName, WebServicePrestashop._password)
        webRequest.ContentLength = imageToAdd.Length
        webRequest.Method = "POST"
        webRequest.ContentType = "image/jpeg"


        Dim boundary As String = "----" & DateTime.Now.Ticks.ToString("x", CultureInfo.InvariantCulture)
        webRequest.ContentType = "multipart/form-data; boundary=" & boundary
        Dim beginPostData = "--" & boundary & vbCrLf & "Content-Disposition: form-data; name=""image""; filename=""torrente.jpg""" & _
            vbCrLf & "Content-Type: image/jpeg" & vbCrLf & vbCrLf
        Dim boundaryBytes = System.Text.Encoding.ASCII.GetBytes(vbCrLf & "--" & boundary & "--" & vbCrLf)
        Dim beginPostDataBytes = System.Text.Encoding.ASCII.GetBytes(beginPostData)


        webRequest.ContentLength = beginPostData.Length + imageToAdd.Length + boundaryBytes.Length


        ' Get the request stream
        Using dataStream As Stream = webRequest.GetRequestStream()
            dataStream.Write(beginPostDataBytes, 0, beginPostDataBytes.Length)
            dataStream.Write(imageToAdd, 0, imageToAdd.Length)
            dataStream.Write(boundaryBytes, 0, boundaryBytes.Length)
        End Using


        ' Get the response
        Using webResponse As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse)
            If webResponse.StatusCode = HttpStatusCode.OK Then
                Using reader As New StreamReader(webResponse.GetResponseStream())
                    response = reader.ReadToEnd()
                    MsgBox(response)
                End Using
            End If
        End Using


    Catch ex As WebException
        MsgBox(ex.Message.ToString())
        Dim reader As New StreamReader(ex.Response.GetResponseStream)
        MsgBox(reader.ReadToEnd)
    End Try
End Sub
person edkalel    schedule 10.09.2014