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

Obrazki ze spacją w nazwie nie są poprawnie wysyłane na serwer

Object Storage Arubacloud
0 głosów
324 wizyt
pytanie zadane 21 września 2018 w PHP przez Q7V Gaduła (4,250 p.)

Cześć, mam taki kodzik w PHP, jest to część większego skryptu, ale ta część jest odpowiedzialna za przesył obrazka na serwer. Pliki które mają spacje w nazwie nie są wysyłane na serwer, wysyła się tylko ta część do spacji np. screen from friday wysyła się jako screen.

<?php
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
} else {
    echo "File is not an image.";
    $uploadOk = 0;
}
// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}
}

 

2 odpowiedzi

+1 głos
odpowiedź 21 września 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)

Witam,

Najlepszym rozwiązaniem byłaby zamiana spacji na _ (lub jakiś inny znak) używając str_replace.

komentarz 21 września 2018 przez Q7V Gaduła (4,250 p.)
Dzięki, ale jak to zastosować nie niszcząc logiki kodu? Bo jak dam to dla zmiennej $_FILES["fileToUpload"]["size"] to mi się nie wykrzaczy?
komentarz 22 września 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
A dlaczego dla "size"? Po prostu edytujesz nazwę pliku a potem wszystkie operacje wykonujesz na pliku ze zmienioną nazwą.
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
Sorki, miało być "name" :P
0 głosów
odpowiedź 21 września 2018 przez Muhin Gaduła (4,120 p.)

Według php.net nie powinno się stosować funkcji getimagesize() do sprawdzania czy plik jest obrazkiem.

http://php.net/manual/en/function.getimagesize.php

Spróbuj z czymś takim:

if (move_uploaded_file($target_file, $_FILES["fileToUpload"]["tmp_name"])) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

//edit

Jednak to masz dobrze. W dokumentacji podali to w odwrotnej kolejności i mnie to zmyliło.

Pokaż co trzymasz w zmiennej $target_file

komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

 

komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)

Ogólnie mam taką strukturę pliku:

      $target_dir = dirname(__FILE__).'/../../img/';
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $url = basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
      require_once 'img_upload.php';

 

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)

Wstaw na sam początek:

var_dump($_FILES["fileToUpload"]["name"])

I przed przesłaniem pliku:

var_dump($_FILES["fileToUpload"]["name"])

Po czym prześlij jakiś plik ze spacją i pokaż rezultat.

edit:

Dodaj jeszcze gdzieś 

var_dump($target_file)

(Oczywiście gdzieś po deklaracji)

komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)

W kolejności w której podałeś mam taki zwrot danych:

string(39) "Screenshot from 2018-09-17 19-53-33.png" 
string(39) "Screenshot from 2018-09-17 19-53-33.png" 
string(100) "/usr/share/nginx/html/q/github/choco/admin/classes/../../img/Screenshot from 2018-09-17 19-53-33.png" 

 

komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
ups, przepraszam - plik się wgrał, ale jak go zasysam z bazy to wgrywa się obrazek ze ścieżką trwającą do spacji tzn. np. /img/screen zamiast /img/screen shot
komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
Wstaw najlepiej wszystko co odpowiada u Ciebie za upload tych obrazków.
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
      var_dump($_FILES["fileToUpload"]["name"]);

      $target_dir = dirname(__FILE__).'/../../img/';
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $url = basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
      var_dump($_FILES["fileToUpload"]["name"]);
      var_dump($target_file);
      require_once 'img_upload.php';


###
img_upload.php
###
<?php
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
} else {
    echo "File is not an image.";
    $uploadOk = 0;
}
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
    echo "Error with uploading your file.";
}
}

 

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
Jak rozumiem trzymasz nazwy tych plików w bazie danych? To dodaj jeszcze kod wstawiania tego do bazy.
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
          $dbh = new PDO("mysql:host={$where};dbname={$db}", $username, $passworddb);
          $add=$dbh->prepare("INSERT INTO choco_posts (day,title,post, url) VALUES (:day, :dbtitle, :post, :url)");
          $add->bindValue(':day', $date, PDO::PARAM_STR);
          $add->bindValue(':post', $content, PDO::PARAM_STR);
          $add->bindValue(':dbtitle', $header, PDO::PARAM_STR);
          $add->bindValue(':url', $url, PDO::PARAM_STR);
          $add->execute();

Nazwa jest normalnie wstawiana do bazy.

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
Hmm, no to rzeczywiście jakieś herezje.

Dobra jeszcze raz po kolei:

Jak przesyłasz obrazek na serwer to jego nazwa w katalogu i bazie jest poprawna.

Jak wyciągasz path do obrazka z bazy to okazuje się, że brakuje reszty nazwy po spacji.

Czy dzieje się coś takiego?
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
Tak, są w katalogu w którym powinny być.

Dokładnie, obrazek ma prawidłową ścieżkę w bazie, a gdy zaciągam adres do img src przez PDO to jest jego nazwa tylko do spacji bez rozszerzenia itp. Nazwy które są jednym ciągiem znaku działają normalnie.
komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
To teraz pokaż var_dumpa wszystkiego co wypluje baza jak robisz zapytanie o jakiś obrazek ze spacją.
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)

@Muhin,

Śmieszna sprawa, tak wygląda wygenerowany img

<img class="imgpost" src="img/Screenshot" from="" 2018-09-17="" 19-53-33.png="">

a tak wygląda wyciąganie z bazy

              if(!is_null($row['url'])){
                $img = "img/".$row['url'];
                $imgpath = '<img class="imgpost" src='.$img.'><br /><br />';
              }
                else $imgpath = "";
                echo '<h2 class="center">'.$row['title'].'</h2><p class="date">'.$row['day'].'</p>'.$imgpath.$row['post'] . '<br />';
            }

No oczywiście nad tym kodem jest PDO i pobiera prawidłowo, jednakże tym generuję ścieżkę to obrazka taką dokładną.

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
zrób var_dump($row)
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)
array(8) { ["day"]=> string(10) "22/09/2018" [0]=> string(10) "22/09/2018" ["title"]=> string(3) "ddd" [1]=> string(3) "ddd" ["post"]=> string(1) "d" [2]=> string(1) "d" ["url"]=> string(39) "Screenshot from 2018-09-17 19-53-33.png" [3]=> string(39) "Screenshot from 2018-09-17 19-53-33.png" } 

 

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)
No to musisz szukać czegoś w tym Twoim kodzie którym generujesz te tagi, bo jak i z bazy jak i do bazy ewidentnie trafia cały path Twojego obrazka. Możesz jeszcze pokazać CAŁY kod którym to wyciągasz/generujesz. Może uda się tam coś zobaczyć.
komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)

No niby wygląda wszystko OK.

Tutaj wyciągam obrazki z bazy, pliki bez spacji zaciągają się prawidłowo. Te ze spacją niszczą cały znacznik <img>

        try {
            require 'php/db_login.php';
            $dbh  = new PDO("mysql:host={$where};dbname={$db}", $username, $passworddb);
            $post = $dbh->prepare("SELECT day,title,post,url FROM choco_posts GROUP BY id DESC");
            $post->execute();
            $result = $post->fetchAll();
            foreach ($result as $row) {
              if(!is_null($row['url'])){
                $img = "img/".$row['url'];
                $imgpath = '<img class="imgpost" src='.$img.'><br /><br />';
              }
                else $imgpath = "";
                echo '<h2 class="center">'.$row['title'].'</h2><p class="date">'.$row['day'].'</p>'.$imgpath.$row['post'] . '<br /> '.var_dump($row).'';
            }
            $dbh = null;
        }

 

komentarz 22 września 2018 przez Muhin Gaduła (4,120 p.)

Racja.

Wcześniej nie zwróciłem na to uwagi.

Spróbuj tak:

$imgpath = '<img class="imgpost" src="{$img}"><br /><br />';

 

komentarz 22 września 2018 przez Q7V Gaduła (4,250 p.)

Jeju kochany, bóg zapłać dobry człowieku! To jest to!!! heart

Jedynie odwrotnie cudzysłowia. Pojedyńcze w podwójnych zamiast odwrotnie, ale to edytor mi podświetlił.

Jeszcze raz wielkie dzięki za pomoc, bo nie doszedłbym do tego nigdy.

Podobne pytania

+1 głos
1 odpowiedź 180 wizyt
pytanie zadane 11 lutego 2022 w PHP przez ZnaQu Nowicjusz (130 p.)
0 głosów
0 odpowiedzi 114 wizyt
pytanie zadane 12 maja 2019 w PHP przez r.mar Początkujący (470 p.)
0 głosów
1 odpowiedź 1,470 wizyt
pytanie zadane 7 października 2017 w PHP przez BlackCat_ Początkujący (310 p.)

92,547 zapytań

141,388 odpowiedzi

319,506 komentarzy

61,931 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...