C++ i otwieranie/przesyłanie pliku obrazka

0

Witam Forumowiczów, dopiero co się zarejestrowałem.

Przychodzę do Was z pewnym problemem, który jest do rozwiązania, ale ja już odpadam.
Nakreślę sytuację:

Jestem w trakcie tworzenia aplikacji będącej prostym serwerem www. Aplikacja ma się dobrze, ładuje mi różne pliki, przeglądarka wszystko akceptuje i ładnie wyświetla. Oprócz...

Obrazki. Tu zaczyna się problem. Przeglądarka wysyła do mnie zapytanie o konkretny obrazek. Mam więc funkcję, która otwiera konkretny plik z katalogu i dołącza jego treść do Response. Dociera wszystko, oprócz danych obrazków.

Mam więc przeczucie, że nie umiem poprawnie obsługiwać plików obrazków. Początkowo próbowałem za pomocą <fstream.h> znak po znaku, czytając binarnie, ale coś było źle.
Spróbowałem też za pomocą fopen();, ale do przegladarki docierają tylko pierwsze 4 bajty danych i koniec, coś się urywa.

Znajdzie się ktoś, kto wyjaśni mi jak powinno się poprawnie operować czystymi danymi z plików bmp, png czy jpg? Zdążyłem już wyczytać, że trzeba tam jakoś nagłówek otworzyć, posprawdzać, no ale w międzyczasie piszę tu, liczę na pomoc.
;)

p.s. jeśli coś słabo wyjaśniłem, śmiało pytać.

0

Przede wszystkim miło by było gdybyś wkleił kod, bo tak to można tylko zgadywać.

W skrócie - obrazki to dokładnie takie same pliki jak każde inne - jeśli nie docierają to raczej dlatego że źle je wysyłasz (chyba że np. twój komputer zyskał sztuczną inteligencję i cię nie lubi więc wykrywa że ciąg bajtów który wysyłasz jest obrazkiem a później złośliwie go blokuje).

Spróbowałem też za pomocą fopen();, ale do przegladarki docierają tylko pierwsze 4 bajty danych i koniec, coś się urywa.

Przy przesyłaniu nie musisz się martwić o nagłówki, za to przy odczytywaniu bardziej możliwe. Strzelam że tylko raz wywołujesz fread, albo jeszcze lepiej:

FILE *f = fopen("...", "r");
fread(buf, sizeof(f), 1, f);

co na pierwszy rzut oka może wyglądać ok, ale po głębszym zastanowieniu nie robi nic ;)

0

Oto kod funkcji zajmującej się plikiem (opatrzę w komentarze):

char * openFile(char fname[128])
{
    char path[128];
    char * buff;  // treść pliku w pamięci
    FILE *file;
    int fSize = 0;
    
    sprintf(path, "www%s", fname);   // ma szukać pliku w odp. folderze
        
    file = fopen(path, "r");
    
    fseek(file, 0, SEEK_END);
    fSize = ftell(file);   // nie znalazłem niczego lepszego na długość pliku :>
    rewind(file);
    
    buff = (char*)malloc(sizeof(char)*fSize);
    fread(buff, 1, fSize, file);  // czyta zawartość pliku
    
    fclose(file);
    
    return buff;  // zwraca, potem ta treść jest dołączana do  Response i idzie do Klienta
}

Kod jest jeszcze ciepły, bo z rana. Wiem, brakuje zabezpieczeń, sprawdzania czy plik istnieje, ale to zostawiam na później.
Ogólnie kiedy klient woła o jakiś typowo tekstowy plik, jak html, css czy js, wszystko jest czytane ok. A obrazek się krzani... Zaznaczam, że w Response ustawiam odpowiednio Content-Type: image/bmp itd. jakby co. ;p
Ta funkcja traktuje obrazek jak zwykły ciąg znaków. Myślałem, że tak będzie ok.
A moze to przegladarka jako klient (Firefox) oczekuje innej formy danych obrazu? MOże istnieje jakaś specyfikacja na ten temat?

Pamiętam, że gdy chciałem wyświetlić np. bitmapę w oknie Windows, była tam gotowa funkcja LoadImage chyba... w każdym razie szło łatwo gotową funkcją. Teraz widzę, że jednak nie wszystko wiedziałem o obsłudze obrazków. :/

0
Reddius napisał(a)
file = fopen(path, "r");

Powinno być:

file = fopen(path, "rb");
0

Niestety, zmiana na "rb" nic nie pomogła.
Próbowałem jeszcze i nadal nic. :/

0

Idiotyczny koncept ale spróbuję - wysyłasz to co zwraca funkcja? No to faktycznie tylko 4 bajty docierają ;-P

Funkcja zwraca tylko wskaźnik, a ty musisz wysłać określoną porcję danych zaczynającą się od tego wskaźnika i długą tak jak długość pliku.

Łatwo można sprawdzić - czy dane które docierają to znaki drukowalne (praktycznie każdy format ma nagłówek) czy losowa sekwencja bitów (wskaźnik...)?

ogólnie na moje oko ta funkcja działa...

0

Zawsze dociera coś takiego:

BM6*
(gdzie * to jakiś bliżej niekreślony znak)

Już drugi raz słyszę, że ta funkcja jest zepsuta. Kurczę, siadam i spróbuję zrobić to poprawnie. :s

0

Zawsze dociera coś takiego:

BM6*

(gdzie * to jakiś bliżej niekreślony znak)

0_o To oznacza że funkcja wczytująca obraz jest zupełnie ok, i w dodatku pierwsze bajty są poprawnie wysyłane...
http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html

A mógłbyś pokazać jak wysyłasz te informacje (bo funkcja jest najwyraźniej ok)

0

EDIT:
Problem został rozwiązany, temat można usunąć.

0

To miło by było gdybyś napisał co nie działało bo jesteśmy ciekawi. A tematu nie usuniemy i tak.

0

Ok, nie ma sprawy.

Tuż przed samym wysłaniem łączyłem jeszcze dwie zmienne w jedną i miałem tam coś w stylu... sprintf(senddata, "%s", file).

Zrzut do cstring (%s) dość mocno zmieniał postać danych binarnych z pliku, heh..:P
Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1