Это мой первый пост здесь. Мне нужно немного помощи для немного странной системы здесь. По сути, у меня есть регистрация / регистрация пользователя, встроенная в мою игру, и у меня есть система, которая использует аватары размером 128×128 пикселей для пользователей, использующих цель рендеринга.
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;
}
}
Он создается и добавляется в мою БД, но данные, которые были переданы, искажены? Я делаю что-то не так для перевода здесь?
Спасибо
Аарон Стюарт
Эта ссылка описывает более простой подход, который использует загрузку файла способом, аналогичным тому, как это делает веб-браузер:
Загрузить на PHP сервер из клиентского приложения c sharp
Дело в том, что вы генерируете свое изображение, сохраняете его во временный файл.
Затем вы загружаете его на сервер, захватите его с $_FILES
и сохраните его там, где вам нужно, запишите его в БД и т. д.
А затем вы удаляете свой временный файл и продолжаете то, что вы собираетесь делать дальше.
Как обработать загрузку файлов на стороне сервера, вы можете найти в документация о том, как загружать файлы в php.
Я думаю, что ответ удаляет Encoding.Default.GetString и просто передает байты для веб-вызова.
Другим вариантом может быть то, что вы не устанавливаете кодировку формы как multipart / form-data, хотя я не уверен, что вы используете формы вообще.