2016-04-28 43 views
6

Temelde JavaScript olan Electron'u kullanarak bir masaüstü uygulaması yapıyorum. İçinde Bir masaüstü uygulamasından Rails API'ye gönderilen bir görüntü nasıl alınır

, böyle benim Raylar API bir görüntü yolluyorum:

(basitleştirilmiş)
var myHeaders = new Headers(); 
myHeaders.append('Authorization', 'Token token=redacted'); 
myHeaders.append('Content-Type', 'application/json'); 
myHeaders.append('Accept', 'application/json'); 

... 

var formData = new FormData(); 
formData.append("img", base64EncodedImage); 
var myPost = {method: 'POST', headers: myHeaders, body: formData} 
fetch("url", myPost) 

benim Raylar konsolunda

, görüyorum:

{"REMOTE_ADDR"=>"127.0.0.1", "REQUEST_METHOD"=>"POST", "REQUEST_PATH"=>"/task/screenshot", "PATH_INFO"=>"/task/screenshot", "REQUEST_URI"=>"/task/screenshot", "SERVER_PROTOCOL"=>"HTTP/1.1", "HTTP_VERSION"=>"HTTP/1.1", "HTTP_HOST"=>"localhost:3000", "HTTP_CONNECTION"=>"keep-alive", "CONTENT_LENGTH"=>"454856", "HTTP_ACCEPT"=>"application/json", "HTTP_ORIGIN"=>"null", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) testivate-research-gigs/1.0.0 Chrome/49.0.2623.75 Electron/0.37.5 Safari/537.36", "HTTP_AUTHORIZATION"=>"Token token=redacted", "CONTENT_TYPE"=>"application/json", "HTTP_ACCEPT_ENCODING"=>"gzip, deflate", "HTTP_ACCEPT_LANGUAGE"=>"en-US", "rack.url_scheme"=>"http", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"3000", "QUERY_STRING"=>"", "rack.tempfiles"=>[#<Unicorn::TmpIO:/var/folders/k9/vnpft_6d7qs6xmdb9_4svvmw0000gn/T/0.19309304750270062>], "rack.input"=>#<Rack::Lint::InputWrapper:0x007fe1de317000 @input=#<Unicorn::TeeInput:0x007fe1de31d950 @len=454856, @chunked=false, @socket=#<Kgio::Socket:fd 7>, @parser=#<Unicorn::HttpParser:0x007fe1db08ce00>, @buf="", @rbuf="------WebKitFormBoundaryxkkhvE17qoI5ozlK\r\nContent-Disposition: form-data; name=\"img\"\r\n\r\ndata:image/jpeg;base64,iVBORw0KGgoAAAANSUhEU...

Ancak resme ulaşamıyorum.

olduğunu
> request.body.read 
> request.body.rewind 
> request.body.read 
> request.env 

, ben komutların çoğu boş yanıtları almak ve ben, request.env yazdıktan sonra sonra sadece dönmeden orada süresiz asılı: Bu benim Pry kullanarak denetleyicisi içine damla ne görüyorum olduğunu Komut istemi.

Resme nasıl ulaşabilirim?

Teşekkürler.

BTW, POST'ları alan ancak gömülü görüntülerle karşılaşmayan diğer işlemler mükemmel şekilde çalışıyor. Önceden, bu eylem XMLHttpRequest()'u fetch() kullanmıyorken de mükemmel şekilde çalışıyordu, ancak Google Chrome Uzantımı bir Electron uygulamasına çevirmek için geçiş yapmak zorunda kaldım.

doğrudan S3 ziyade S3-Raylar aracılığıyla benim resim yükleyerek kendim için bu sorunu çözmüş

GÜNCELLEME. Sadece çalışır, ancak uygulama yoluyla gitmekten daha hızlıdır, şimdi sadece görüntüyü bulmak için nereye bakacağımı söylemek zorundayım. Ama asıl meselem olarak ele alınmadığı için, bu sorudan ve ödül açıklığından ayrılıyorum. Belki birisi bunu çözecek, ödül alacağını iddia edecek ve birisinin yolunda faydalı bulacağı bir cevap yazacaktır.

+0

Görüntüyü raylarda saklamak, herhangi bir gemiyi nasıl kullanırsınız? – 7urkm3n

+0

Görüntü yükleme http: // stackoverflow için ataç gem'i kullanın.com/questions/35765578/rails-api-paperclip-uploading-image-converting-it-to-base-64-ve-saving-it-ve/35766241 # 35766241 –

+0

parametreden süzülmüş gibi görünüyor. – joewoodward

cevap

0

Masaüstü uygulamasından API'nın yerel olarak sunulan bir sürümüne (yani, terminalden terminalleri çalıştırmak) bir istek göndererek ve ne alındığını görmek için ray konsolunu izleyerek test ederim. Param bir listesini görmelisin. img param da doğru

form verilerini göndermek için masaüstü uygulamasını çimdik gerekir sonra img param görmüyorsanız o zaman muhtemelen raylar denetleyicisi

güçlü params yoluyla kara listeye edilir isteğe dahil edilirse Ayrıca

, sana o zaman, düzenli parametreler toplama yoluyla mevcut olmalıdır izin params sizi size POST ile düzgün görüntü gönderiyorsanız masaüstü uygulaması

+0

Merhaba @ joewoodward. Teşekkürler. JavaScript'in 'fetch()' yöntemini kullanarak aslında bir "POST" gönderiyorum. Bu yüzden 'var myPost = {method: 'POST', başlıklar: myHeaders, body: formData}'. "Pry kullanarak denetleyicimde gördüğüm şey burada" dediğimde, uygulamayı localhost üzerinde çalıştırdığımda gördüğüm şeyden bahsediyorum. –

1

alınamayacak ve buna sahip değil bir yazı kullanıyor olmalıdır şüpheli base64 kodlanmış resminizi okuyabilir ve yazabilir:

File.open('some/path/to/image.jpg', 'wb') do|f| 
    f.write(Base64.decode64(base_64_encoded_data)) 
end 

Neden zaten request.body adresinden okuma yapıyorsunuz? Denetleyicinizde params form verisinden değerlerin bir hash değeri olmalıdır.