• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobiera mi plik jpg ale nie otwiera

Aruba Cloud - Virtual Private Server VPS
0 głosów
168 wizyt
pytanie zadane 8 stycznia w PHP przez arcziart Nowicjusz (140 p.)
edycja 8 stycznia przez Comandeer

 Otóż stworzyłem bank zdjęć tylko że nie pobiera mi wybranej fotki przez przeglądarkę tylko wyświetla się komunikat "Prawdopodobny format pliku jest nie obsługiwany. Oto kod pliku zamowienie.php

<?php
$id=$_GET['id'];
 if ($link = mysqli_connect('localhost', 'root', '', 'photo')) {
}

else {
    echo 'Błąd połączenia!';
}
//zapytanie sql do bazy określające jakie dane mają zostać pobrane


    $wynik = mysqli_query($link, "SELECT * From fotki WHERE id='".$id."'");
while ($co = mysqli_fetch_array($wynik)) {
     $id = $co['id'];
    $rodzaj = $co['cena'];;
    $zdjecie = $co['foto1'];
echo "<img src=http://localhost/bank/upload/$zdjecie width=500 height=200></img>";   
echo "<a href=Zakup.php?name=$zdjecie>Zamawiam</a>";
echo "<h2>Zamówiłeś $zdjecie do zapłaty:$rodzaj";
}

A to kod pliku Zakup.php:


<?php
$filename = $_GET['name'];

 
header('Content-Type:application/force-download');//ustawiamy mu uniwersalny typ mime (można bawić się w nadawanie mu application/msword, image/gif, itd...
header('Content-Disposition: attachment; filename='.basename($filename).';');//tutaj podajemy nazwę pliku - domyślnie ustawiłem, aby plik nazywał się tak jak oryginał
header('Content-Length:'.@filesize($filename));//dodajemy wielkość pliku
@readfile($filename)or die('File not found.');//czytamy plik 
 ?>
komentarz 8 stycznia przez Comandeer Guru (606,480 p.)
Proszę nie tworzyć wielu wątków na ten sam temat: https://forum.pasja-informatyki.pl/597645/pobieranie-zdjec-przez-przegladarke-php

Tamten poprzedni zamykam, bo nie ma w nim żadnych szczegółów.
komentarz 10 stycznia przez Tajfun8 Nowicjusz (100 p.)
Wygląda na to, że coś nie działa prawidłowo przy próbie pobrania zdjęć. Komunikat "Prawdopodobny format pliku jest nieobsługiwany" może wynikać z kilku rzeczy. Sprawdź, czy PHP poprawnie odczytuje pliki, czy ścieżka do zdjęcia jest właściwa, oraz czy format pliku jest wspierany. Może również warto dodać więcej logiki, żeby zobaczyć, co dokładnie się dzieje. Jeśli nie działa, sprawdź, czy PHP ma dostęp do folderu `upload` i czy plik w ogóle istnieje. Może też być problem z samym plikiem. Warto by było przetestować to dokładniej, żeby znaleźć przyczynę. :)

3 odpowiedzi

+2 głosów
odpowiedź 8 stycznia przez Comandeer Guru (606,480 p.)

W której przeglądarce? Nagłówek Content-Disposition powinien sam z siebie wymusić download, więc ustawianie dziwnego typu MIME nie powinno być konieczne. Spróbowałeś zamienić application/force-download na image/jpeg?

Inna rzecz, że nie do końca masz poprawną składnię tego nagłówka. Zobacz na MDN – nazwa pliku musi być w cudzysłowach, jeśli zawiera znaki specjalne (np. spację), a na końcu nie ma średnika.

+2 głosów
odpowiedź 8 stycznia przez Gynvael Coldwind Nałogowiec (30,270 p.)
Ściągnij jeden plik w ten sposób i zobacz co jest w środku tego pliku. Ew. jeśli nie wiesz jak to zrobić, wyślij nam ten ściągniety plik.

Od razu dodam, że jeśli ten kod to jest po prostu projekt do nauki, to spoko :). Natomiast jeśli to coś więcej, to musisz trochę (trochę bardzo) popracować nad jego bezpieczeństwem – teraz jest to trochę marzenie hakera ;)
0 głosów
odpowiedź 8 stycznia przez VBService Ekspert (256,600 p.)
edycja 9 stycznia przez VBService

BTW,
na początku sprawdź, czy żądanie pochodzi z GET i czy $_GET['id'] coś zawiera (jakąś wartość), jeżeli oba te warunki nie są spełnione nie ma sensu wykonywać reszty kodu, np.:

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    exit('Błąd: Nieprawidłowy typ żądania.');
}

$id = htmlspecialchars($_GET['id']) ?? null;
if (!$id) {
    exit('Błąd: Brak lub nieprawidłowy parametr "id".');
}

// reszta kodu

kolejna sprawa, "dziwne" masz sprawdzenie połączenia z bazą danych,

 if ($link = mysqli_connect('localhost', 'root', '', 'photo')) {
}
 
else {
    echo 'Błąd połączenia!';
}

zrób np.:

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    exit('Błąd: Nieprawidłowy typ żądania.');
}

$id = htmlspecialchars($_GET['id']) ?? null;
if (!$id) {
    exit('Błąd: Brak lub nieprawidłowy parametr "id".');
}

$link = mysqli_connect('localhost', 'root', '', 'photo');
if (!$link) {
    exit('Błąd połączenia z bazą danych: ' . mysqli_connect_error());
}

// reszta kodu
  • skoro masz $co['cena'] użyj zmiennej $cena,
  • <img src=http://localhost/bank/upload/$zdjecie width=500 height=200></img> - nie potrzeba znacznika zamknięcia,
  • <h2>Zamówiłeś $zdjecie do zapłaty:$rodzaj - brak znacznika zamknięcia </h2>

sprawdź, np.:

$id = mysqli_real_escape_string($link, $id);
$result = mysqli_query($link, "SELECT * FROM fotki WHERE id=$id");
if (!$result) {
    exit("Błąd zapytania: " . mysqli_error($link));
}

if (mysqli_num_rows($result) > 0) {
    $base_url = 'http://' . $_SERVER['HTTP_HOST'] . '/bank/upload/';
    while ($data = mysqli_fetch_array($result)) {
        // $id = $data ['id']; // nie użyto w przedstawionym kodzie
        $price = $data['cena'];
        $image = htmlspecialchars($data['foto1'], ENT_QUOTES, 'UTF-8');

        echo "
            <h2>Zamówiłeś $image, do zapłaty: $price</h2>
            <img src='{$base_url}{$image}' width='500' height='200' alt='Image'>
            <a href='Zakup.php?name=$image'>Zamawiam</a>            
        ";
    }
} else {
    echo "<p>Nie znaleziono zdjęcia o podanym ID.</p>";
}

ale tak jak napisał

@Gynvael Coldwind;

Od razu dodam, że jeśli ten kod to jest po prostu projekt do nauki, to spoko :). Natomiast jeśli to coś więcej, to musisz trochę (trochę bardzo) popracować nad jego bezpieczeństwem – teraz jest to trochę marzenie hakera ;)

w przyszłości pomyśl nad czymś w rodzaju (Prepared Statements), np.:

$id = htmlspecialchars($_GET['id']) ?? null;

if (!$id && !is_numeric($id)) {
    exit("Nieprawidłowe ID.");
}

$stmt = $link->prepare("SELECT * FROM fotki WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();

 

 

P.S. Czy rozważałeś zabezpieczenie obrazków  przed pobraniem ich bez zapłaty, czyli:

komentarz 9 stycznia przez arcziart Nowicjusz (140 p.)
Tak to jest kod tylko do nauki. Chyba się w czymś pomyliłem ściąga mi plik jpg tylko pojawia się komunikat w tym co otwiera mi zdjęcia: "Prawdopodobnie ten format pliku jest nie obsługiwany.

Podobne pytania

0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 20 kwietnia 2020 w PHP przez swill Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 214 wizyt
pytanie zadane 6 listopada 2018 w PHP przez Rick_Sanchez Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 746 wizyt

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...