2015-04-30 3 views
1

Вопрос в нижней строке: что такое правильный PHP, чтобы я мог включить файл двоичных данных в объект ответа json?Как безопасно вернуть данные файла в PHP

У меня есть (iOS, хотя это не имеет значения) приложение, общающееся с сервером. Я хочу, чтобы сервер возвращал файл при успешном входе в систему. Я делаю NOT хочу, чтобы этот файл можно было загрузить через браузер или другими способами. Следовательно, каталог файлов защищен от общедоступного просмотра.

У меня файловую структуру на сервере, который выглядит следующим образом:

.../userFiles/ 
    myFile.zip 
    yourFile.zip 
    somebodyElsesFile.zip 
    // all the other files, snip 
.../server/ 
    login.php 
    // other stuff, snip 

userFiles/ каталог имеет drwxrw---- разрешения, и тот же владелец & группа, как server/, так что я думаю что часть правильно.

Мой сервер код РНР:

// A bunch of stuff, snip. 
// by this point, user is already verified valid login. 
$filePath = "../userFiles/$username.zip"; 
if (file_exists($filePath)) 
{ 
    // get the user's file 
    $fileData = file_get_contents($filePath); 
    if ($fileData) 
    { 
     $response->addparameters(array('data' => $fileData)); 
     $response->addparameters(array('DEBUG-filePath' => $filePath)); 
    } 
    else 
    { 
     $response->addparameters(array('msg' => "can't read data.")); 
     $response->addparameters(array('DEBUG-filePath' => $filePath)); 
     $response->setStatusCode(500); 
    } 
} 
else 
{ 
    // deal with non-existent file, snip 
} 

$response->send(); 
exit(); 

Когда я войти с моего приложения, то JSON ответ выглядит следующим образом:

myapp[13529:3615028] -[LoginViewController connection:didReceiveData:] ***** Login, but no data: 
    { 
     "DEBUG-filePath" = "../userFiles/olie.zip"; 
     data = "<null>"; 
     token = [token redacted]; 
    } 

Что я делаю неправильно? Что еще более важно: что такое правильный PHP, чтобы я мог включить файл двоичных данных в объект ответа json?

Это не имеет большого значения (за исключением того, что я использую приложение, а не браузер, для доступа к этому API), но я запускаю iOS и мой желаемый способ получить данные файла, как только все это работает является:

NSData *zipFile = [json objectForKey: @"data"]; 
// unzip the file, deal with contents, snip. 

Дополнительная информация: Мой $response код 200, а DEBUG-filePath и data параметры дают мне высокую степень уверенности в том, что я на этом конкретном пути кода (в отличие от некоторых других провал, в другом месте.)

Я довольно эксперт в iOS, но очень новичок в PHP. Мне удалось загрузить & сохранить файл на работу, но у меня возникли проблемы с возвратом его при следующем входе в систему.

Любые советы были бы наиболее ценными.

Спасибо!

+0

Опечатка: $ fileData = file_get_contents ($ farmFilePath); vs $ fileData = file_get_contents ($ filePath); – jancha

+0

Нет, это просто плохое редактирование с моей стороны. Починю. (Извините, я немного модифицировал оригинал, пытаясь удалить всю ссылку на «ферму», так как это не является частью проблемы. Похоже, я пропустил 2, теперь исправлено.) – Olie

+0

Кроме того, мой объект ответа - '$ response = new Response(); '; исходный источник снимается непосредственно из http://bshaffer.github.io/oauth2-server-php-docs/cookbook. Я не думаю, что проблема существует, так как все остальное в ней работает отлично (и оно используется повсюду «как механизм Oauth2».) Если нет чего-то странного, где он неправильно обрабатывает двоичные данные. Наверное, я мало знаю об этом. – Olie

ответ

2

попробуйте base64 кодировать содержимое во время передачи. например $data = base64_encode($data);

Если протокол связи - json, я уверен, что двоичные данные не будут работать напрямую, поэтому предлагается кодирование base64 для передачи.

+0

Yup, это достало мне целую кучу данных (а не предыдущий объект NSNull). Теперь я имею дело с «Unterminated string around character 198», но я либо сам разрешу это, либо задаю новый вопрос, позже. Благодаря! – Olie

+1

Чтобы сохранить пользователей за несколько секунд, чтобы найти * другой ответ SO, чтобы получить эти данные на конце iOS: 'NSData * zipData = [[NSData alloc] initWithBase64EncodedString: zipData64 options: 0];' (new в NSData as iOS 7 :)) – Olie

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