Суть вопроса: что такое правильный PHP, чтобы я мог включить двоичный файл данных в объект ответа на основе json?
У меня есть (iOS, хотя это не имеет значения) приложение, которое взаимодействует с сервером. Я хочу, чтобы сервер возвращал файл при успешном входе в систему. я делаю НЕ хотите, чтобы этот файл можно было загружать через браузер или другими способами. Следовательно, каталог файлов защищен от публичного просмотра.
У меня есть файловая структура на сервере, которая выглядит так:
.../userFiles/
myFile.zip
yourFile.zip
somebodyElsesFile.zip
// all the other files, snip
.../server/
login.php
// other stuff, snip
userFiles/
каталог имеет drwxrw----
разрешения и тот же владелец & группа как server/
, так что я считать эта часть права.
PHP-код моего сервера имеет:
// 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. Мне удалось получить загрузку & сохранить файл для работы, но у меня возникли проблемы с возвратом при следующем входе в систему.
Любые советы будут наиболее цениться.
Спасибо!
попробуйте base64 кодирование контента во время передачи. например $data = base64_encode($data);
если протоколом связи является json, я совершенно уверен, что двоичные данные не будут работать напрямую, поэтому для передачи предлагается кодировка base64.
Других решений пока нет …