2010-05-18 4 views
0

웹 응용 프로그램에는 Flash (AS3)를 사용하여 사용자의 웹캠을 사용하여 사진을 찍은 다음 결과 바이트 배열을 PHP로 전달하여 재구성합니다 서버에 저장됩니다.ActionScript JPG 바이트 배열을 자바 스크립트 (및 결국 PHP)에 전달

그러나이 웹 응용 프로그램을 오프라인으로 전환 할 수 있어야하며 Gears를 선택해야합니다. 사용자는 앱을 오프라인으로 가져 와서 작업을 수행 한 다음 서버에 다시 연결하면 데이터를 Google의 중앙 데이터베이스와 "동기화"합니다.

더 이상 Flash와 상호 작용할 PHP가 없지만 사용자가 사진을 찍고 저장할 수 있도록해야합니다. Flash에서 로컬 데이터베이스로 만드는 JPG를 저장하는 방법을 알지 못합니다. 우리는 바이트 배열, 직렬화 된 문자열을 저장하거나 객체 자체를 실제로 유지 한 다음 PHP 또는 Flash (및 PHP)로 다시 전달하여 JPG를 다시 만들 수 있습니다.

우리는 시도 : 를 - 대신 PHP의 자바 스크립트에 바이트 배열을 전달하지만, 자바 스크립트 (객체가 그 방법을 박탈하는 것) 그것으로 무엇을 할 수있을 것 같지 않습니다 - 바이트를 stringifying Flash에서 배열 한 다음 자바 스크립트에 전달하지만, 우리는 항상 같은 문자열을 얻을 :

ÿØÿà 

이제 우리가 통과 한 후 반환 노선에, 자바 스크립트에 전달, Flash의 문자열을 직렬화 생각하고 문자열을 다시 Flash로 변환 한 다음 PHP로 전달하여 JPG로 재구성합니다. (아휴). 우리 팀의 누구도 광범위한 플래시 배경을 갖고 있지 않으므로 조금 잃어 버렸습니다.

직렬화는 갈 수 있습니까? 이 작업을 수행하는보다 현실적인 방법이 있습니까? 누구든지 이런 종류의 경험이 있습니까? 아마도 우리는 AS에서 바이트 배열 클래스와 같은 자바 스크립트 클래스를 만들 수 있습니까?

+0

앱이 실제로 브라우저에 있어야합니까? AIR를 사용하면 응용 프로그램을 사용자 OS에서 기본으로 실행하고 나중에 업로드/동기화 할 수 있도록 파일을 로컬로 저장하거나 SQLite 데이터베이스에 BLOB으로 저장할 수 있습니다. 아마도 빌드의 주요 변경 사항 인 것 같습니다. 이유는 대답으로 제안하는 대신 화를 냈습니다 ;-) – jolyonruss

+0

브라우저에 살 필요가 없습니다. , 그러나 온라인 버전은 이미 쓰여지고 일하고있다. 또한 나머지 응용 프로그램 (사진은 단지 작은 부분 임)이 이식되어 잘 작동합니다. 현실적으로 우리는 전체 기능을 하나의 기능으로 AIR로 옮기고 싶지 않습니다. – Gus

답변

2

왜 여기에 자바 스크립트를 사용하고 싶은지 잘 모르겠습니다. 어쨌든 붙여 넣은 문자열은 JPG 헤더의 시작과 같습니다. 문제는 JPG가 NUL (값이 0 인 문자)을 확실히 포함한다는 것입니다. 이것은 문자열을 잘랐을 가능성이 높습니다 (게시 한 샘플의 경우 인 것처럼 보임). JPG를 "문자열 화"하려는 경우 표준 접근 방식은 Base 64로 인코딩합니다.

그러나 데이터를 로컬에서 유지하려는 경우 Flash에서이를 수행 할 수 있습니다. 간단하지만 제한이 있습니다.

Shared Object 로컬을 사용할 수 있습니다. 기본적으로 이미지 파일에는 부적합한 100KB 제한이 있습니다. 사용자에게 앱에 더 많은 공간을 할당 해 줄 것을 요청할 수 있습니다. 어쨌든 크기 차이는 매우 중요하기 때문에 원시 픽셀이 아닌 JPG로 이미지를 저장하려고합니다.

공유 객체는 사용자를 위해 직렬화/직렬화를 투명하게 처리합니다. 몇 가지주의 사항이 있습니다. 모든 객체를 실제로 직렬화 할 수있는 것은 아닙니다. 우선, 매개 변수없는 생성자가 있어야합니다. Sprites, MovieClips 등의 DisplayObjects는 작동하지 않습니다. 그러나 ByteArray를 직렬화 할 수 있으므로 JPG를 로컬로 저장할 수 있습니다 (사용자가 추가 공간을 허용하는 경우). AMF3을 인코딩 스키마로 사용해야합니다 (기본 설정입니다). 또한 serialize하는 객체의 유형을 유지하려면 serialize하는 클래스를 registerClassAlias으로 매핑해야합니다. 그렇지 않으면 Object 객체로 처리됩니다. 앱 라이프 사이클에서 한 번만 수행하면되지만 공유 객체에 대한 모든 읽기/쓰기 작업을 수행해야합니다. 의 라인을 따라

뭔가 :

registerClassAlias ​​("flash.utils의.ByteArray ", ByteArray);

자바 스크립트가 아닌 Shared Object를 사용하고 싶습니다. 사용자에게 이미지를 저장할 공간을 더 많이 주어야한다는 것을 명심하십시오. 당신이 그들을) 오프라인으로 작업 할 수 있도록하고, 사용자가 자신이) 브라우저의 쿠키를 삭제할 수처럼 언제든지 (에서 데이터를 삭제할 수있다.

편집

나는 정말하지 않았다 실현 질문의 일부인 "기어스를 선택했습니다."

이 경우, 기초 64가 JS에 데이터를 전달하려고 시도 할 수 있습니다. Actionscript 쪽에서는 (사용 가능한 여러 가지 Base64 인코더/디코더 중 하나를 잡아내는 것이 쉽습니다) Gear의 API에는 이미 사용 가능한 인코더/디코더가 있어야한다고 가정합니다 (또는 적어도 하나를 찾지 않아야 함). 그 시점에서 아마도 Blob로 변환하고 디스크에 저장해야 할 것입니다 (어쩌면 BlobAPI을 사용하지만, Gears에 대한 경험이 없으므로 확실하지 않습니다).