2014-12-09 1 views
0

이것은 내 첫 번째 게시물입니다. 여기에 괴짜 시스템에 약간의 도움이 필요합니다. 기본적으로 내가 갖고있는 게임에는 등록/사용자 가입이 포함되어 있으며 렌더 타겟을 사용하는 사용자를 위해 128x128 픽셀 크기의 아바타를 준수하는 시스템을 갖추고 있습니다.웹 서버 문제에 2 바이트 텍스처 업로드

https://www.dropbox.com/s/5vw8i9151uz6zkn/Screenshot%202014-12-08%2021.33.11.png?dl=0

나는, 이미지 데이터를받을 파일로 저장 한 다음 로그인 한 사용자에게 이미지를 지정하도록되어 시스템의 온라인이있다. 나는 이미지 데이터를 보내 그러나 때 , 그것은 파일을 잘 저장하지만 어떤 이유로 든 적절한 png 파일이 아닙니다. 나는 렌더 타겟이

public static void SaveToGLPng(this Microsoft.Xna.Framework.Graphics.Texture2D texture, Stream s) 
    { 
     byte[] imageData = new byte[4 * texture.Width * texture.Height]; 
     texture.GetData<byte>(imageData); 
     //Since OpenGL is a special snowflake, switch around the R and B values 
     for (int i = 0; i < imageData.Length; i += 4) 
     { 
      byte temp = imageData[i]; //store r 
      imageData[i] = imageData[i+2];//swap r 
      imageData[i+2] = temp;//swap b 
     } 

     int bp = 0; 
     System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(texture.Width, texture.Height); 
     System.Drawing.Imaging.BitmapData bmData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, texture.Width, texture.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat); 
     IntPtr pnative = bmData.Scan0; 
     System.Runtime.InteropServices.Marshal.Copy(imageData, 0, pnative, 4 * texture.Width * texture.Height); 
     bitmap.UnlockBits(bmData); 
     bitmap.Save(s, System.Drawing.Imaging.ImageFormat.Png); 
    } 
} 

그래서 모두가 잘 작동하는 다음 코드를 사용하여 클라이언트 측에서 적절한 이미지 파일로 저장 한 나는 메모리 스트림에 반환 된 데이터를 저장하고 WebCall라는 클래스에 전달 이는 비동기 웹 클라이언트 기능을 구현

WebCall에 대한

public void MakeCall() 
    { 
     using (WebClient wb = new WebClient()) 
     { 
      UriBuilder b = new UriBuilder(url); 
      wb.UploadValuesCompleted += wb_UploadValuesCompleted; 
      wb.UploadValuesAsync(b.Uri, paramSet); 
     } 
    } 

생성자 방법

라는 클래스
public static WebCall UploadAvatar(byte[] data, int userID) 
    { 
     WebCall call = new WebCall(); 
     call.url = URL; 
     call.WriteParam("action", "upload_avatar_game"); 
     call.WriteParam("game", "true"); 
     call.WriteParam("userID", userID.ToString()); 
     call.WriteParam("file_data", Encoding.Default.GetString(data)); 
     return call; 
    } 
,363,210

나는 WebCall

  MemoryStream pngStream = new MemoryStream(); 
      captureTarget.SaveToGLPng(pngStream); 

      var webCall = Tools.WebCall.UploadAvatar(pngStream.GetBuffer(),infoContext.UserID); 
      webCall.OnCallCompleted +=webCall_OnCallCompleted; 
      webCall.MakeCall(); 
      pngStream.Close(); 

을하고 그리고 모두가 여기에이 방법을

function upload_avatar_game($params){ 
    $upload_dir = "../files/avatars/"; 

    $data = $params['file_data']; 

    $dt = new DateTime(); 
    $dtform = $dt->format("Y-m-d-H.i.s"); 

    $name = $dtform . ".png"; 
    $fullpath = $upload_dir . $name; 

    if(!isset($params['userID'])){ 
     echo 'false'; 
     die(); 
    } 

    $user_id = $params['userID']; 
    try { 
     $existing_file = FileModel::get_user_avatar($user_id); 

     if($existing_file){ 
      unlink($existing_file->getDownloadPath()); 
      $existing_file->setIsDeleted(true); 
      $existing_file->Save(); 
     } 

     $success = file_put_contents($fullpath,$data); 
     if($success){ 
      $size = filesize($fullpath); 
      $file = FileModel::create_file($name,$upload_dir,0,$size,$user_id); 
      if($file){ 
       $fid = $file->getFileID(); 
       echo 'true'; 
       die(); 
      } 
     } 

    } catch(Exception $ex){ 
     $GLOBALS['partial'] = '../partials/error.php'; 
     $GLOBALS['error_msg'] = $ex->getMessage(); 
    } 
} 

를 호출하는 params를 메서드에 전달되는 곳이다 잘 서버로 가져옵니다. 거기가 legitmate 요청 있는지 시험하고있다하지만 아무것도

function process_script(){  
    if(!isset($_GET['action']) && !isset($_POST['action'])) 
    { 
     header('Location: ?action=login_user'); 
    } 

    $params = isset($_GET['action']) ? $_GET : $_POST; 

    //test for legimate request. 

    //after test 
    switch($params['action']) 
    { 
     case "upload_avatar_game": 
      if(isset($params['game'])) 
      { 
       upload_avatar_game($params); 
      } else { 
       upload_avatar($params['fileUpload']); 
      } 
      break; 
     } 
    } 

비록 'file_data'항목에 수행되고 있지 그것은 작성되는 모든이 왜곡되어 내 DB 있지만 통해 전송되는 데이터에 추가? 나는 여기에 옮길 무언가 잘못하고 있니?

덕분에 아론 스튜어트

+0

'$ params'를 (를) 전달하는 코드를 'upload_avatar_game'에 표시하십시오. 'WebCall'은 기본적으로'POST' 요청을 보냅니 까? – baldrs

+0

그런데 어떻게 "깨진"것입니까? 'WebCall'은 전송을 어떻게 암호화합니까? 서버 측에서 추가 디코딩이 필요할 수 있습니다. – baldrs

+0

call.WriteParam ("file_data", Encoding.Default.GetString (data)); 이것이 인코딩 방법입니다. 나는 그것을 해독 할 필요가 있는지 확신 할 수 없다. –

답변

0

이 링크 방식으로 웹 브라우저가 어떻게하는지 유사한 파일 업로드를 이용하여 간단한 방법을 설명합니다

Upload to PHP server from c sharp client application

요점은 당신이 당신의 이미지를 생성 임시로 저장한다는 것입니다 파일.

그럼 당신은 등, DB에 기록, $_FILES에서 그것을 잡고 당신이 필요로 할 저장, 서버에

을 업로드 그리고 당신은 임시 파일을 제거하고 당신이하고자하는 것을 계속 다음 것.

서버 업로드 파일 처리 방법은 documentation on how to upload files in php에서 찾을 수 있습니다.

0

나는 대답은 Encoding.Default.GetString을 제거하고 바로 웹 호출에 바이트를 전달할 생각합니다.

다른 옵션은 양식을 전혀 사용하지 않을지라도 양식 다중화/양식 데이터로 설정하지 않을 수도 있습니다.