Загрузить 2d байт текстуры для проблем веб-сервера

0

Это мой первый пост здесь. Мне нужна небольшая помощь для немного странной системы здесь. В основном, у меня есть регистрация/регистрация пользователей, встроенная в мою игру, и у меня есть система, которая придерживается 128x128 пиксельных размерных аватаров для пользователей, использующих цель рендеринга.

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, который реализует функциональность Async WebClient

Класс вызван для 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;
    }

Где я делаю 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();
    }
}

Вот где параметры передаются методу. Существует тестирование, чтобы проверить, является ли он запросом на легитимность, но ничего не делается для записи "file_data", хотя

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

Он создается и добавляется в мою БД, но отправленные данные искажены? Я делаю что-то неправильно для передачи здесь?

Спасибо Аарон Стюарт

  • 0
    Пожалуйста, покажите код, который передает $params в upload_avatar_game . WebCall отправляет запрос POST по умолчанию?
  • 0
    Как это "искажено" тогда? Как WebCall кодирует передачу? Возможно, потребуется дополнительное декодирование на стороне сервера.
Показать ещё 2 комментария
Теги:
image
encoding
monogame

2 ответа

0
Лучший ответ

Эта ссылка описывает более простой подход, который использует загрузку файла таким образом, как это делает веб-браузер:

Загрузка на сервер PHP из приложения с острым клиентом

Дело в том, что вы создаете свой образ, сохраняете его во временном файле.

Затем вы загружаете его на сервер, захватываете его из $_FILES и сохраняете, где вам нужно, пишите его в БД и т.д.

И затем вы удаляете свой временный файл и продолжаете то, что вы намереваетесь сделать дальше.

Как обрабатывать загрузку файлов на стороне сервера вы можете найти в документации о том, как загружать файлы в php.

0

Я думаю, что ответ удаляет Encoding.Default.GetString и просто передает байты на веб-вызов.

Другой вариант может заключаться в том, что вы не устанавливаете кодировку формы как multipart/form-data, хотя я не уверен, что вы используете формы вообще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню