2013-09-25 10 views
8

Przenosimy plik Blob (obraz) w dół do pliku WWW i renderujemy go do obszaru roboczego na drugim końcu.Ustawianie typu zawartości na obiekcie blobowym

Gdy używam createObjectURL z kropelka, mam to ostrzeżenie:

Resource interpreted as Image but transferred with MIME type text/plain: "blob:https%3A//example.com/demo". 

Tworzymy URL obiektu przy użyciu następującego kodu. Blob jest przesłać za pomocą standardowego websocket z socket.binaryType = "blob"; po stronie klienta:

socket.onmessage = function(e) { 
    var blob = e.data; 
    var url = (window.URL || window.webkitURL).createObjectURL(blob); 

    var image = document.createElement('img'); 
    image.src = url; 
} 

Jedynym sposobem mogę myśleć, aby rozwiązać ten jest ostrzeżenie, aby utworzyć kopię blob z następującego kodu, ale nie wiem chcesz wprowadzić narzut kopiowania wszystkich danych:

var blob = new Blob([e.data], { 
    type: 'image/gif' 
}); 

Ta metoda jest wywoływana dziesiątki razy na sekundę.

Wszelkie pomysły na temat ustawiania typu zawartości bloba bez tworzenia duplikatu obiektu Blob z new Blob?

+0

Czy możesz pokazać, w jaki sposób wysyłasz dane blob? Zauważ, że właściwość '.binaryType' działa tylko na wiadomość binarną - jeśli wysyłasz tekst, parametr' event.data' zawsze będzie zawierał ciąg znaków. – Bergi

+0

To jest bardzo proste: 'socket.send (message);' na końcu JS węzła. 'message' jest binarnym obiektem blob pochodzącym z aplikacji OSX poprzez SocketRocket (typ' NSData'). Wiadomość jest zdecydowanie binarnym 'blob'. –

Odpowiedz

5

Najpierw chciałbym się zastanowić, czy kiedy mówisz "błąd", masz na myśli "ostrzeżenie". Są to naprawdę dwie różne rzeczy, a przeglądarka traktuje je inaczej (zwykle tylko śledzi/podnosi ostrzeżenia, gdy narzędzia programistyczne są otwarte itp.).

Tak więc najpierw zakwestionowałbym założenie, że jest to nawet problem (obciążenie przeglądarki "automatycznym pisaniem" plamą w porównaniu do kosztów "wstawiania" Bloba itp.).

Ale, powiedział, kropelka.Właściwość type jest rzeczywiście niewspółmierna w JavaScript i jako taka musisz ją ustawić, gdy obiekt blob jest "nowy". W twoim przypadku to brzmi jak jesteś uzyskiwanie danych z gniazda Objective-C i tylko stokrotka łączenia go poprzez:

ws.send(fromObjectiveCSocket, {binary: true, mask: true}); 

Dane blob sama z gniazda Objective-C nie zawierający „nagłówka” typ dane tego typu, gdy przesyła je, i wygląda na to, że twój węzeł wcale nie dotyka blobu (czy próbowałeś zdobienia nowego Bloba w swoim węźle, a następnie wysłałeś go w głąb gniazda, aby sprawdzić, czy zachowuje on pisanie?) .

To, co się dzieje, to że websocket wysyła tylko dane blobu, gdy je otrzyma, a gdy odbiera je javascript, to niejawnie wpisuje go z nowym Blobem zaraz i tam, tylko z pustym typem .

W zasadzie nie, wydaje się, że nie ma żadnego sposobu obejścia nowej konstrukcji Blob, jeśli naprawdę chcesz pozbyć się tego ostrzeżenia. Nawet jeśli próbowałeś sztuczek, takich jak dodawanie typu do danych typu blob, a następnie ich łączenie itd., Nadal nie możesz ominąć kodu otrzymującego websocket, niejawnie wpisując go jako blob z pustym typem.

+0

Fajnie, dzięki! Jesteś na miejscu z twoimi założeniami: błąd vs. ostrzeżenie (i zaktualizowałem moje pytanie) i ponownie: łączę łańcuch danych binarnych z Objective-C, poprzez Node, i dalej do klienta :) I haven ' t próbowałem dekorować nowego Bloba w węźle. Jak najlepiej to wypróbować? Jeśli istnieje powielenie, najlepiej mieć go na serwerze o wysokiej wydajności. To może zadziałać. Obecnie ustawienie 'typ' w Objective-C z' CGImageDestinationCreateWithData' (type 'kUTTypeGIF'), ale nie wydaje się, aby przejść. –

+0

@ChrisNolet - przez dekorowanie go na serwerze miałem na myśli próbowanie nowego Bloba() w węźle iw rzeczywistości ustawienie typu, a następnie sprawdzenie, czy kropelka, którą dostaniesz z gniazda, zachowuje typ ... Jestem ładna sceptycznie o tym jednak, zwłaszcza przy korzystaniu z gniazda binarnego, zakład przepuszcza tylko dane, aby przeglądarka nadal "wpisała" to anonimowo. –

+0

Tak, uczciwe połączenie. Miałem szansę na stworzenie bloba po stronie serwera, ale Node nie obsługuje 'blob'natywnie. Jakieś dalsze przemyślenia na ten temat? –

0

Prawdopodobnie należy ustawić Content-Type po stronie serwera przed wysłaniem go

+0

Witam @ Adassko. Próbowałem, ale właściwość type nie wydaje się być zmienna. Wykonanie 'console.log (e.data)' zarówno przed jak i po ustawieniu 'e.data.type = 'image/gif'' ujawnia, że ​​właściwość się nie zmienia. Dodałem trochę więcej kodu do pytania. –

+0

Tak, próbowałem tego sam i zredagowałem moją odpowiedź. Twój kod z tworzeniem nowego Bloba z kopią zawartości nie działa ani razu, gdy zdecydujesz się go użyć. – Adassko

+0

Interesujące - wypróbowałem proponowane (intensywne pamięci) rozwiązanie w moim pytaniu i działa dobrze na Chrome v29, chociaż wprawdzie mam nie próbowałem go jeszcze w innych przeglądarkach. –

0

Można rozwiązać ten problem od końca jesteś dostarczając obraz. Ten problem występuje z powodu niewłaściwego typu zawartości, więc powinieneś skonfigurować swój serwer, aby wysyłał obraz z nagłówkami obrazów.

Jeśli było to w PHP, trzeba mieć coś podobnego

header("Content-Type: image/jpeg"); 
echo $image_blob; 
exit; 

(tylko dawać wyobrażenie)

W przypadku node.js, choć nie jestem ekspertem można ustawić typ zawartości na obiekcie odpowiedzi jak:

app.get('/image.gif', function(req, res) { 
    res.set('Content-Type', 'image/gif'); 
    res.sendfile('./image.gif'); 
}); 
+1

Brzmi świetnie. Używam Node.js i po prostu wysyłam dane za pomocą 'socket.send (message);' poprzez pakiet 'ws' (wersja 0.4.x). Wiadomość jest pierwotnie po prostu binarnym pakietem z innego websocket pochodzącego z Objective-C. Wszelkich pomysłów, jak ustawić "Content-Type" w tym scenariuszu? –

+0

@ChrisNolet, Zaktualizowano moją odpowiedź. – Starx

+1

Dzięki @Starx. Wygląda na to, że dotyczy to żądań typu "GET". W tym przypadku są to wszystkie sieci z 'socket.binaryType = 'blob'';) –

1

„Blob URL działa tylko z żądań gET, a gdy jeden jest z powodzeniem wniosek, B rowser wysyła kod statusu HTTP 200 OK, a także wysyła nagłówek Content-Type, który wykorzystuje właściwość type obiektu Blob. "

var bb = new BlobBuilder(); 
var blob = bb.getBlob("x-optional/mime-type-here"); 

//send via websocket 
//load via websocket  

Czy jestem całkowicie wyłączony?

stałam się tym wszystkim z https://www.inkling.com/read/javascript-definitive-guide-david-flanagan-6th/chapter-22/blobs

HTML5 Rocks wydaje się być co nowego Blob z reakcji z użyciem nagłówków XHR życzenie. Więc może wcale nie jest tak źle. http://www.html5rocks.com/en/tutorials/file/xhr2/#toc-response

Po prostu wyrzucam kilka pomysłów.

+0

Dzięki Sheng za pomysły. Wierzę, że możesz osiągnąć coś podobnego do mojego 'nowego rozwiązania Blob()' używając BlobBuilder, jednak nie jest to przestarzałe: https://developer.mozilla.org/en-US/docs/Web/API/BlobBuilder, i nadal będzie wymagają skopiowania pamięci z 'ArrayBuffer' (danych websocket) do bloba - jak sądzę. –

Powiązane problemy