2014-09-09 3 views
0

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

"Невозможно сохранить это изображение".

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 является дополняющим содержанием нового изображения.

Как это исправить?

ответ

0

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

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 
Смежные вопросы