0

로컬 파일 시스템에서 S3으로 이미지를 직접 업로드해야하는 Firefox 추가 기능을 개발 중입니다.XUL : S3에 직접 업로드하지만 파일 입력 요소를 사용하지 않음

AWS에서 볼 수있는 예제는 이미지 전송을위한 표준 파일 입력 컨트롤 (다른 AWS 특정 요청 서명 등을 사용하여 웹 페이지에서이 작업을 수행하는 방법을 설명합니다. 아주).

http://bencoe.tumblr.com/post/30685403088/browser-side-amazon-s3-uploads-using-cors

Uploading Image to Amazon s3 with HTML, javascript & jQuery with Ajax Request (No PHP)

http://aws.amazon.com/articles/1434

그러나, 나는 내가 파일 입력을 사용하지 않고 파일 을 업로드 할 수있는 방법에 관한 정보를 찾을 수 없습니다, 나는 로컬 절대 경로를 알고 (addon 자체가 S3에 업로드하기 전에 파일을 씁니다).

는 "적절한"방법을 찾으려고 노력의 몇 시간 후, 나는 다음과 같은 파일 입력을 날조 생각 :

var fileInput = document.createElementNS("http://www.w3.org/1999/xhtml","input"); 
fileInput.setAttribute('type', 'file'); 
fileInput['files'] = [{ 
    mozFullPath: file.path, 
    name: file.leafName, 
    size: file.fileSize, 
    type: 'image/gif' // testing only with gifs 
}]; 

및 FD 내 FormData 객체 인 다음 fd.append("file", fileInput.files[0]);을. 그런 다음 AJAX를 통해 s3에 게시합니다.

파일을 S3에 업로드합니다. 그러나 브라우저에서 파일을 열 때 이미지 대신 텍스트 "undefined"이 표시됩니다.

그럼 내가 fd.append("file", fileInput.files); 시도 -이 시간 대신에 이미지의 브라우저에 의해 반환 된 내용이 텍스트 "[object FileList]"

내가 난처한 상황에 빠진거야입니다! 파일 입력을 위조하려고하는 것과 관련이 있다는 것을 알고 있습니다. 나는 이것이 더 깨끗하고 더 정확한 도핑 방법이어야한다고 믿습니다.

누구든지이 문제를 해결할 수있는 방법을 밝힐 수 있습니까? 미리 감사드립니다. chrome 코드 (. 일명 특권 코드)에서

답변

2

그냥 경로와 파일 생성자를 호출하여 단순히 DOM 파일 객체를 생성 할 수 있습니다 :

var file = File("path/to/some/file"); 
fd.append("file", file); 

자세한 내용은 다음을 참조하십시오 Using the DOM File API in chrome code.

+0

답변 해 주셔서 감사합니다. 나는 그것이 올바른 방법 (내 질문에 포함하는 걸 잊어 버린 것)처럼 보였지만 너무 노력했지만 잘 작동하지 않습니다. S3는 나에게 오류 "MalformedPOSTRequest"를 제공합니다. – techfoobar

+0

그냥 : 새로운 파일() 대신 파일 입력을 사용할 때 똑같은 코드가 작동합니까? 유선 (콘솔 w/요청 로깅 및/또는 게으른 사람들을위한 네트워크 패널)에서 요청이 어떻게 다른가요? newtab, BTW ...는 실제 부가 기능 코드를 사용하는 것보다 쉽습니다. 개발자 도구 및 Scratchpad를 포함하여 무료 'chrome' 권한 페이지가 열립니다. ;) – nmaier

+0

실제로 DOM 파일 접근 방식이 효과적입니다. 그 오류는 다른 것이 었습니다 (단지 몇 분 전에 그것을 못 박았습니다!). 파일을 디스크에 쓰고 너무 빨리 ('nsIWebBrowserPersist.saveUri'를 사용하여) 파일을 업로드하려고했습니다. 업로드하기 전에 지연을 도입하여 saveUri의 작성자가 파일을 닫도록했습니다 ('nsIWebBrowserPersist'에서 close 메소드를 찾을 수 없었기 때문에). – techfoobar