2013-04-29 1 views
2

overflowers!Base64 -> AJAX -> PHP пишет 0 байтовый файл в Android-браузере для Android

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

  1. Создать изображение из полотна.
  2. Напишите изображение на моем сервере через AJAX, используя PHP. (разрешения для каталога 777)
  3. Прибыль.

Единственная икота, которую я имею до сих пор, - это использование браузера Android Browser. Я смог успешно сохранить изображение, используя список поддерживаемых браузеров для этого проекта. (Safari, Firefox, Chrome, IE9 +). Однако, когда я тестирую браузер Android, PHP -, сохраняющий файл в правильном каталоге, но в 0 байт. Я тестирую на Android v. 4.1.1

Мой вопрос: почему в этом случае я получаю файл с 0 байтами? Как я могу это исправить?

Я был по всему Google и stackoverflow, пытаясь найти ответ, и, к сожалению, до сих пор тестировал около двадцати различных решений. Мне интересно, есть ли ошибка, которую я легко потерял, поскольку я так долго смотрел на тот же код.

Вот AJAX вызов: (CoffeeScript)

$.ajax 
     type: "POST" 
     url: "#{servicesSrc}image-utils.php" 
     data: 
      post_method: "save_image" 
      image_data: image.src 
      name_prefix: @currentServiceString + "_" 
     success: (response) => 
      doStuff(response) # <-- redacted method name 
     error: (jqXHR, textStatus, errorThrown) -> 
      console.error("storeTempUserImage :: Error: #{textStatus}", errorThrown) 

и PHP: ('УДАЛЕНО/FILE/PATH') правильно, и используется в каждом сценарии, но я могу» t.

$randomID = get_random_string(); 
$imageData = $_POST["image_data"]; 
$imageData = str_replace("data:image/jpeg;base64,", "", $imageData); 
$imageData = str_replace(" ", "+", $imageData); 
$data = base64_decode($imageData); 
$namePrefix = (isset($_POST["name_prefix"])) ? $namePrefix = $_POST["name_prefix"] : $namePrefix = ""; 
$absoluteURL = $namePrefix.$randomID.".jpg"; 
$destinationURL = "REDACTED/FILE/PATH" . $absoluteURL; 
$fp = fopen($destinationURL, "wb"); 
fwrite($fp, $data); 
fclose($fp); 
echo $absoluteURL; 

и выходной образец надлежащим образом сохраненного изображения, и неправильно сохраненное изображение: twitter_jKbxRIt3NRw8Nd1ucJFcDSrMUBPs9H7M.jpg 98 Кб (97,866 байт) twitter_LLAwIET5VJDO4LXvD4O0hsngnj2UYata.jpg 0 В (0 байт)

Благодаря заранее за любую помощь!

+1

ли 'image_data' содержать что-нибудь, отправляемое из Android-браузера? Как извлекается «image.src»? Это больше похоже на то, что пустые данные передаются скрипту PHP, чем ошибка с скриптом. – pilsetnieks

+0

Отличное наблюдение.Ваш комментарий помог мне понять, что часть проблемы была вне AJAX/PHP, относящаяся к данным изображения. Как только у меня проблема будет решена, я прокомментирую свои выводы и пометьте это как решение. Спасибо за вашу помощь! –

ответ

1

Большое спасибо @pilsetnieks за помощь. Решение было в основном за пределами того, что я объяснил выше. Я использовал метод PHP выше для обработки как jpegs, так и png.

Очевидно,

$imageData = str_replace("data:image/jpeg;base64,", "", $imageData); 

будет обрабатывать только изображения JPEG. Чтобы решить, я использовал следующую строку для обработки как JPEGs и PNGs:

$imageData = substr($imageData, strpos($imageData, ",")+1); 

Кроме того, я удалил расширение с этой линии, так что файл может быть любого типа:

$absoluteURL = $namePrefix.$randomID.".jpg";