@deight

Как записать байтовую строку в файл на php?

В js с помощью функции readAsBinaryString получаю часть файла в виде байтовой строки, по средствам ajax передаю её php скрипту, в котором нужно её сохранить. Если сохранять через file_put_contents или (fopen,fwrite,fclose) то строка сохраняется как текст. Проверял, на сервер приходит строка как если открыть в hex редакторе и посмотреть на dump. Как записать в файл эту байтовую строку?
Для fopen параметр b не помогает, пишет все равно как строку(файл получается будто исходник открыть через hex редактор, скопировать dump и вставить в блокнот). Нашел где то что file_put_contents можно запускать с флагом FILE_BINARY но результат тот же.
Под dump я имею ввиду текстовое представление байтов, то что обычно с права от шестнадцатеричного представления.

Короче так я отправляю файл
function _ajax_file(file,path,onprogress,onend,onerror,size){
		size=size||2000000;
		var start= 0,
			end=size<file.size?size-1:file.size-1,
			r= new FileReader,
			_af=function(){
				var x = new XMLHttpRequest;
				x.open('POST', path, true);
				x.setRequestHeader('Content-Type', 'application/ajax-file');
				x.onreadystatechange=function(){
					if(x.readyState==4){
						console.log(x.responseText);
						if(onprogress)
							onprogress(start/file.size*100);
						if(start<file.size)
							_af();
						else if(onend)
							onend();
						delete x;
					}
				};
				r.onload=function(){
					if(start<=size)
						x.setRequestHeader('ajax-file','start');
					else if(start>=file.size)
						x.setRequestHeader('ajax-file','end');
					x.send(this.result);
					//console.log(this.result);
				};
				r.readAsBinaryString(file.slice(start,end));
				start=end+1;
				end=size+end<file.size?size+end:file.size;
			};
		_af();
	}

_ajax_file(this.files[0],location.pathname,function(x){progress.value=x;},function(){progress.value=0;});


Так принимаю
if($_SERVER["CONTENT_TYPE"]=='application/ajax-file; charset=UTF-8')
{
	$postdata=file_get_contents("php://input");
	if($_SERVER['HTTP_AJAX_FILE']=='start')
		if(file_exists('temp.txt'))
			unlink('temp.txt');
	//file_put_contents('temp.txt',$postdata,FILE_APPEND);
	$fs=fopen('temp.txt','ab');
	fwrite($fs,$postdata);
	fclose($fs);
	die();
}

Что я делаю не так?
  • Вопрос задан
  • 2786 просмотров
Пригласить эксперта
Ответы на вопрос 2
shaks
@shaks
fopen('file.txt', 'wb') # где b говорит о том что писать будем байт код
Ответ написан
Adamos
@Adamos
на сервер приходит строка как если открыть в hex редакторе и посмотреть на dump

Вот ее-то вы и записываете. Параметр b, естественно, работает, но никто не будет за вас превращать hex-представление обратно в байты.
Читайте свою строку по два символа, превращайте их в байт, его и записывайте в файл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы