2013-07-04 2 views
1

Я пытаюсь загрузить изображение в свой профиль с помощью api, но я получаю сообщение об ошибке Unknown_ NOTUND_FOUND 404. вызов, который я использую, это /d2l/api/lp/1.0/profile/myProfile/image, я передаю тип содержимого, длину и имя файла (profileImage). Я передаю изображение как dataStream. Я также уменьшил размер изображения. Есть идеи?valence desire 2 узнать профиль загрузить фото

здесь также является частью моего CallAction кода Orginally получил от Getting Started например

public void CallAction(ID2LUserContext userContext, int retryAttempts, string url, byte[] data, string method = "") 
    { 
     Uri uri = userContext.CreateAuthenticatedUri(url, method); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.AllowAutoRedirect = false; 
     request.Method = method; 

     if (method.Equals("PUT") || method.Equals("POST")) 
     { 

      request.ContentType = "image/jpeg"; 
      //request.Headers.Add("Content-Disposition", "form-data; name=\"profileImage\"; filename=\"profileImage.jpg\""); 
      request.Headers.Add("Accept-Encoding", "gzip, deflate, compress"); 
      //request.Headers.Add("X-Upload-Content-Type", "image/jpg"); 
      //request.Headers.Add("X-Upload-Content-Length", data.Length.ToString()); 
      //request.Headers.Add("X-Upload-File-Name", "profileImage"); 
      request.ContentLength = data.Length; 

      Stream dataStream = request.GetRequestStream(); 
      dataStream.Write(data, 0, data.Length); 
      dataStream.Flush(); 
      dataStream.Close(); 
     } 

}

Кроме того, когда я бег Добраться до извлечения моей фотографии она также возвращает 404 ошибку.

+0

Является ли ваша загрузка [RFC1867] (http://tools.ietf.org/html/rfc1867.html) соответствует? –

+0

В вашем блоке кода выглядит так, что вы предоставляете заголовки Content-Disposition и 'image/jpeg' Content-Type в заголовки HTTP POST, когда они должны быть прикреплены к заголовку * part *. Заголовки HTTP POST должны содержать Content-Type 'multipart-form/data' (с границей), а * part * должны содержать данные файла (с границей), которые имеют заголовок Content-Disposition (Content-Disposition) form-data) и «Content-Type» (типа содержимого изображения, в вашем случае «image/jpeg»). Мне непонятно, что ваш код это делает. –

ответ

0

Мы протестировали этот вызов против наших тестовых примеров здесь, и он действительно работает. Вот то, что заголовки HTTP пакетов выглядеть для правильного тестового вызова (от вызова формируется с модулем питона requests):

{ 'User-Agent': 'python-requests/1.2.3 CPython/3.3.2 Darwin/12.4.0', 
    'Accept': '*/*', 
    'Content-Type': 'multipart/form-data; boundary=716acd781e224902854e6845bc62f653', 
    'Content-Length': '117886', 
    'Accept-Encoding': 'gzip, deflate, compress' } 

по следующему адресу:

https://somelms.edu/d2l/api/lp/1.0/profile/myProfile/image? 
x_a={appId} 
&x_c=Lz3PDTaUgG46cMF3CajAsiiGzz0C6u5QTLieAmbONZ0 
&x_b={userId} 
&x_d=7sSqbce1_ictuNAs80n01h0jSI0YxxKbPM01W7f49a0 
&x_t={timestamp} 

с телом, которое выглядит следующим образом (обратите внимание на часть заголовков в этом теле, которые характеризуют содержание одной части в теле, который содержит данные изображения):

--716acd781e224902854e6845bc62f653 
Content-Disposition: form-data; name="profileImage"; filename="profileImage-student.png" 
Content-Type: image/png 

{image bytes here} 

--716acd781e224902854e6845bc62f653-- 
+0

Спасибо, я добавил код и дополнительную информацию в свой первоначальный пост, поскольку у меня все еще возникают проблемы. – user2521556

+0

См. Мой комментарий к вашему вопросу; Я также внесла поправки в этот ответ, чтобы лучше понять, куда направляются заголовки. –

0

Этот код должен устранить проблему:

public static void UploadFilesToRemoteUrl(byte[] profileImage, ID2LUserContext userContext, string accion) 
    { 
     //Reference: 
     //action = "/d2l/api/lp/1.3/profile/" + profileIdentifier + "/image"; 

     //profileImage = the profileImage of user read from disk: 
     /* 
     FileStream fileStream = new FileStream(pictureLocalPath, FileMode.Open, FileAccess.Read); 
     Byte[] img = new Byte[fileStream.Length]; 
     fileStream.Read(img, 0, Convert.ToInt32(img.Length)); 
     fileStream.Close(); 
     */ 

     var uri = userContext.CreateAuthenticatedUri(accion, "POST"); 
     string boundary = "bde472ff1f1a46539e54e655857c27c1"; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.ContentType = "multipart/form-data; boundary=" + 
     boundary; 
     request.Headers.Add("Accept-Encoding", "gzip, deflate, compress"); 
     request.Method = "POST"; 
     request.KeepAlive = true; 

     request.Proxy.Credentials = new NetworkCredential(Constantes.UsuarioProxy, Constantes.PasswordProxy, Constantes.DominioProxy); 

     Stream memStream = new System.IO.MemoryStream(); 

     byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + 
     boundary + "\r\n"); 


     string formdataTemplate = "\r\n--" + boundary + 
     "\r\nContent-Disposition: form-data; name=\"profileImage\"; filename=\"profileImage.jpg\"\r\nContent-Type: image/jpeg;\r\n\r\n"; 

     byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formdataTemplate); 
     memStream.Write(formitembytes, 0, formitembytes.Length); 

     //escribo el array de byte de la imagen 
     memStream.Write(profileImage, 0, profileImage.Length); 

     byte[] boundaryClose = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--"); 
     memStream.Write(boundaryClose, 0, boundarybytes.Length); 

     StreamReader readerReq = new StreamReader(memStream); 
     string stringReq = readerReq.ReadToEnd(); 

     request.ContentLength = memStream.Length; 
     Stream requestStream = request.GetRequestStream(); 
     memStream.Position = 0; 
     byte[] tempBuffer = new byte[memStream.Length]; 
     memStream.Read(tempBuffer, 0, tempBuffer.Length); 
     memStream.Close(); 
     requestStream.Write(tempBuffer, 0, tempBuffer.Length); 
     requestStream.Close(); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
      string responseValence = reader.ReadToEnd(); 
      response.Close(); 
     } 
    } 
+0

Не могли бы вы дать некоторое объяснение тому, что делает ваш код? Обычно мы стараемся избегать сообщений, содержащих только код. Вы можете сделать это либо в теле сообщения, либо в комментариях по всему вашему коду :) – Dan

Смежные вопросы