2010-05-10 2 views
0

플렉스 3에서 JPG/PNG 이미지를 업로드 할 때 문제가 발생했습니다. readUTFBytes는 올바른 바이트 길이를 반환하지만 tmpFileContent는 트루 캐스팅되었습니다. 이미지를 만든 PHP 스크립트를 통해 서버에 데이터를 3 문자 만 업로드 한 것처럼 보입니다. 쓸 수 없는. 비 이미지 형식에 대해서는 문제가 없습니다. 여기서 뭐가 잘못 됐니?이미지 바이트를 문자열에 삽입하면 작동하지 않습니까?

var tmpFileContent:String = fileRef.data.readUTFBytes(fileRef.data.length); 

문자열은 바이트를 처리 할 수 ​​있습니까?

+1

액션 스크립트는 모르지만 readUTFBytes를 사용하여 이미지를로드 할 수 있다면 놀랍습니다. 이미지에 바이너리 데이터가 포함되어있어 유효한 utf8 문자열이 아닐 수 있습니다. 대신 바이트 배열을 사용할 수 있습니까? – mcrumley

+0

데이터로 무엇을하려고합니까? – quoo

+0

이 튜토리얼의 Flex 3에서 작동하도록 코드를 수정했습니다 ( ). 그래서 이미지 형식을 제외하고는 오류없이 업로드 할 수있었습니다. readutfbytes가 Flex 4에서 어떻게 작동했는지 궁금합니다. http://www.flexer.info/2009/09/02/multiple-file-upload-using-amfphp/ – Proyb2

답변

0

당신은 항상베이스 64를 사용하여 인코딩 할 수 있습니다 :

var enc:Base64Encoder = new Base64Encoder(); 
enc.encodeBytes(fileRef.data); 
var base64data:String = enc.drain(); 
+0

+1 Base 64는 여기에 갈 방법입니다 (bytearray를 직접 게시 할 수 있도록 백엔드 코드를 변경하지 않으려는 경우) –

+0

데이터를 직접 게시하는 것이 훨씬 효율적입니다. 플래시로 base64 인코딩에 시간을 소비 할 필요가 없으며 대역폭을 덜 사용합니다. – davr

+0

@ davr. 아마도. 아마 원시 데이터를 보내는 것이 빠를 것입니다. 그리고 네, 더 많은 대역폭을 사용하게 될 것입니다. 원본 파일 크기의 정확히 1/3 정도입니다. 그러나 나는 이것을 해왔고 큰 파일을 가지고도 훌륭하게 작동합니다. 그래서 실제 performace 문제가 없다면 (특히 OP가 AMFPHP와 이것 저것으로 이미 설정되어있는 것처럼 보이기 때문에), Actionscript와 php의 몇 줄을 추가하고 이미 설정되어있는 이점이 있습니다 "시스템"이미지 파일에 대한 작업. –

0

튜토리얼에 사용 된 방법만한 어떠한 물체 안전하게 작동하지 않을 하지만 텍스트 파일. 임의의 2 진 형식은 0을 포함 할 가능성이 있습니다. 0 (값이 0 인 바이트)은 일반적으로 많은 언어/플랫폼에서 문자열 터미네이터로 간주됩니다.

var str:String = "abc\x00def"; 
trace(str); 

문자열이 "ABC"에 잘립니다 × 00은 문자열의 끝을 표시하는 것으로 간주되기 때문에,이 코드와 같이 이것은 또한 액션 스크립트의 경우입니다.

나는 maclema가 제안한대로 기본 64로 콘텐츠를 인코딩하는 것이 가장 좋습니다. PHP는 측면에서, 같은 것을 사용하여 파일을을 writting 전에 다시 디코딩 : file_put_contents를 이진 안전 (나는 그렇지 생각) 인 경우

file_put_contents($myFilePath, base64_decode($fileData["filedata"])); 

또한, 내가 기억할 수 없습니다. 그렇다면 fopen ('you_path', 'wb'), fwrite() 및 fclose()를 사용하여 파일을 작성해야합니다. 바이너리를 나타내는 "wb"의 "b"에 주목하십시오. 해당 플래그를 전달하지 않으면 일부 문자 (예 : 개행 및 캐리지 리턴)에 문제가있을 수 있습니다.

추가됨 :

아마도, davr의 제안에 따라, 당신은 AMFPHP가 제대로 처리되는지 확인하기 위해 데이터 된 ByteArray를 전송 시도 할 수 있습니다.

PHP는이 코드와 같이 문자열의 embbeded NUL을 허용하지 : AMFPHP는 문자열로 된 ByteArray를 변환하는 과정에서 패킷을 조작하지 않는 경우,

$str = "a\x00b"; 

var_dump(ord($str{0}));  // 97 
var_dump(ord($str{1}));  // 0 
var_dump(ord($str{2}));  // 98 

그래서,이 실제로 작동 할 수있다. 문자열 PHP에서 작동하는 방법을 제공 (;

// method saves files on the server 
function uploadFiles($fileData) { 
    // new file path an name 
    // to not overwrite the files we add the microtime before the file name 
    $myFilePath = '../../_uploads/'. 
     preg_replace("/[^0-9]+/","_",microtime()).'_'.$fileData["filename"]; 
    // writing on the disk 
    $fp = fopen($myFilePath,"wb"); 
    if($fp) { 
     fwrite($fp,$fileData["filedata"]); 
     fclose($fp); 
    } 
    // returning response - is not used anywhere 
    return true; 
} 

그렇지 않으면, ($ FILEDATA [ 'FILEDATA']) 실제의 형태 AMFPHP는 (아마도 그것은 배열, 확실하지 않은 사용에 대한 데이터를 변환 뭐가 있는지 반향 위해서 var_dump를 시도 싱글 바이트 문자 버퍼와 비슷하지만 문자열을 사용하는 것만 같아요.)

관련 문제