2014-01-30 47 views
1

我想使用API​​上传图像配置文件,但我得到一个未知:NOT_FOUND 404错误。我使用的调用是POST /d2l/api/lp/1.3/profile/(profileId)/image,我正在传递内容类型,长度和文件名(profileImage)。我将图像作为dataStream传递。我也缩小了图像的大小。有任何想法吗?valence desire 2学习配置文件图像上传错误404

   public static void UploadFilesToRemoteUrl(string file, string logpath, NameValueCollection nvc, ID2LUserContext userContext, string accion) 
    { 
     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.png\" \r\nContent-Type: image/png\r\n"; 

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


     // Read image File ************************************************************* 
     FileStream fileStream = new FileStream(file, FileMode.Open,FileAccess.Read); 
     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 
     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      memStream.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close(); 
     //***************************************************************************** 
     //*********** End Read image file ********************************************* 

     memStream.Write(boundarybytes, 0, boundarybytes.Length); 

     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(); 
     StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
     string responseValence = reader.ReadToEnd(); 

    } 
+0

您正在尝试更新其他人的个人资料图片吗?你在路由中为'profileId'参数提供了什么?你确定这是一个有效的用户'profileId'吗?请注意,用户的配置文件ID与用户ID不同# –

+0

HI!是的,profileId是正确的,并且不同于userId。使用的profileId是:xXPMokhy81 – user3254901

+0

您可以添加“accion”的字符串值,这是在这里激发404吗? –

回答

0

它似乎最有可能的是,404未来无论是从

  • 的API路线你提供(和你的API路线后端服务无法比拟的处理方法):这可能是因为值不正确profileId,或路由错误类型的路由或错误的API版本号,等等。

  • 由于某些原因,后端服务正在接受您的配置文件映像数据,但无法将其分配给用户的配置文件。

下面是一些关于上传的配置文件图像数据包的请求/响应细节的捕获。在上传资料图片以“我的个人资料”,我用的就是会从这些数值构建的HTTP标头:

{'Content-Length': '75143', 
'User-Agent': 'python-requests/2.2.1 CPython/3.3.3 Darwin/12.5.0', 
'Content-Type': 'multipart/form-data; boundary=bde472ff1f1a46539e54e655857c27c1', 
'Accept': '*/*', 
'Accept-Encoding': 'gzip, deflate, compress'} 

注意,这是一个多/ form-data的内容主体,以围绕一个界碑身体的一部分。正文内容为请求如下:

--bde472ff1f1a46539e54e655857c27c1 
Content-Disposition: form-data; name="profileImage"; filename="profile_img-225x225.png" 

[actual PNG bytes here] 
--bde472ff1f1a46539e54e655857c27c1-- 

在内容处理标头的name属性必须为profileImagefilename属性应你正在使用提供内容(本地文件名来命名所以,就后端服务而言,它的价值并不特别相关)。

最后,特定的角色权限允许用户编辑某人其他人的配置文件图像,因此您应确保您的调用API调用用户上下文有权编辑其他人的图像。

+0

感谢您的回复!权限不够,但现在SERVER不返回错误404,返回空响应,用户的图像配置文件已损坏... – user3254901

+0

你能帮助我吗?谢谢! – user3254901

+0

响应状态OK> 200。但用户的图像配置文件是坏的。 uplodad文件是profileImage.png – user3254901

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(); 
     } 
    }