Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: upload obrazków przez formularz i 0 bajtów
Forum PHP.pl > Forum > PHP
kurkusmaximus
Stworzyłem formularz do uploadu obrazków(awatarów). Mam 2 konta na tym samym serwerze, jedno na stronę, a drugie na pliki.
Chciałbym by awatary wgrywane były na drugie konto. Plik jest tworzony, ale zajmuje 0 bajtów. W czym tkwi problem?
  1. $ftp = ftp_ssl_connect("adres") or die("Nie można nawiązać połączenia z serwerem");
  2. ftp_login($ftp, "login", "haslo");
  3. if( @GetImageSize($nazwa_pliku) ){
  4. print "<div class='error'>Wystąpił błąd podczas zapisu pliku</div>";
  5. }else{
  6. ftp_pasv($ftp, true);
  7. if( ftp_put($ftp, "/public_html/awatary/".$nazwa_pliku, $_FILES["file"]["tmp_name"], FTP_ASCII) ){
  8. print "<div class='pass'>Zapisano zmiany</div>";
  9. }else{
  10. print "<div class='error'>Wystąpił błąd podczas przesyłania pliku</div>";
  11. }
  12. }
  13. ftp_close($ftp);

Error to: "Wystąpił błąd podczas przesyłania pliku".
Fifi209
Spróbuj jeszcze z: FTP_BINARY
kurkusmaximus
Nie działa.
Czy problemem może być to, że konta nie mają uprawnień (jedno nie ma dostępu do drugiego)? - podpowiedź od znajomego
Fifi209
A mógłbyś dać więcej kodu? Bo nie ma w ogóle uploadu zdjęć, nie widzę nigdzie is_uploaded_file ani move_uploaded_file

Co do uprawnień, przecież łączysz się przez FTP, czyli użytkownik na którego łączysz musi mieć tam prawa do zapisu.
kurkusmaximus
Jasne:
  1. if( !empty($_FILES["file"]["tmp_name"]) ){
  2. if ($_FILES["file"]["error"] > 0){
  3. switch($_FILES["file"]["error"]){
  4. case UPLOAD_ERR_INI_SIZE:
  5. print "<div class='error'>Rozmiar wybranego obrazu przekracza limit ustawiony w php.ini</div>";
  6. case UPLOAD_ERR_FORM_SIZE:
  7. print "<div class='error'>Rozmiar wybranego obrazu przekracza limit ustawiony w formularzu</div>";
  8. case UPLOAD_ERR_PARTIAL:
  9. print "<div class='error'>Wybrany obraz nie został wysłany w całości</div>";
  10. case UPLOAD_ERR_NO_FILE:
  11. print "<div class='error'>Nie wysłano obrazu</div>";
  12. case UPLOAD_ERR_NO_TMP_DIR:
  13. print "<div class='error'>Wystąpił problem ze znalezieniem folderu tymczasowego</div>";
  14. case UPLOAD_ERR_CANT_WRITE:
  15. print "<div class='error'>Wystąpił błąd podczas zapisu obrazu</div>";
  16. case UPLOAD_ERR_EXTENSION:
  17. print "<div class='error'>Wysyłanie obrazu zostało wstrzymane</div>";
  18. default:
  19. print "<div class='error'>Wystąpił nieokreślony błąd</div>";
  20. }
  21. }else{
  22. if( ($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/png") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg") ){
  23. if( ($_FILES["file"]["size"] < 20000) ){
  24. $rozdzielczosc = getimagesize($_FILES["file"]["tmp_name"]);
  25. if( ($rozdzielczosc[0] <= 60) && ($rozdzielczosc[1] <= 45) ){
  26. $typ_pliku = strip_tags($_FILES["file"]["name"]);
  27. $typ_pliku = explode(".", $typ_pliku);
  28. if( ($typ_pliku[1] == "gif") || ($typ_pliku[1] == "png") || ($typ_pliku[1] == "jpeg") || ($typ_pliku[1] == "pjpg") )
  29. $nazwa_pliku = md5(uniqid(rand(), true));
  30. $nazwa_pliku = $nazwa_pliku.".".$typ_pliku[1];
  31. echo "$nazwa_pliku<br>";
  32. echo "Type: " . $_FILES["file"]["type"] . "<br>";
  33. echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br>";
  34.  
  35. $ftp = ftp_ssl_connect("adres") or die("Nie można nawiązać połączenia z serwerem");
  36. ftp_login($ftp, "login", "haslo");
  37. ftp_pasv($ftp, true);
  38. if( @GetImageSize("http://img.domena.eu/awatary/".$nazwa_pliku) ){
  39. print "<div class='error'>Wystąpił błąd podczas zapisu pliku</div>";
  40. }else{
  41. if( ftp_put($ftp, "/public_html/awatary/".$nazwa_pliku, $_FILES["file"]["tmp_name"], FTP_ASCII) ){
  42. print "<div class='pass'>Zapisano zmiany</div>";
  43. }else{
  44. print "<div class='error'>Wystąpił błąd podczas przesyłania pliku</div>";
  45. }
  46. }
  47. ftp_close($ftp);
  48.  
  49. }else{
  50. print "<div class='error'>Twój awatar nie może być większy niż 60px x 45px</div>";
  51. }
  52. }else{
  53. print "<div class='error'>Waga awatara nie może być większa niż 20KB</div>";
  54. }
  55. }else{
  56. print "<div class='error'>Dozwolone typy plików: gif, png, jpg</div>";
  57. }
  58. }
  59. }


Fifi209
Najpierw użyj funkcji, które podałem wink.gif

A to:
  1. if( ($typ_pliku[1] == "gif") || ($typ_pliku[1] == "png") || ($typ_pliku[1] == "jpeg") || ($typ_pliku[1] == "pjpg") )


Nie można do tablicy wrzucić i sprawdzać in_array?
kurkusmaximus
Utworzyłem folder o atrybutach 777 i nazwie "temp".
Pliki są przenoszone do tego folderu przez funkcję move_uploaded_file i nie zawierają błędów.
Po tej operacji próbuję wysłać plik z folderu "temp" przy pomocy put, ale ciągle tworzą się puste pliki o nazwie == jak kopiowany plik.
Gdzie tkwi błąd?
  1. if( !empty($_FILES["file"]["tmp_name"]) && is_uploaded_file($_FILES['file']['tmp_name']) ){
  2. if ($_FILES["file"]["error"] > 0){
  3. switch($_FILES["file"]["error"]){
  4. case UPLOAD_ERR_INI_SIZE:
  5. print "<div class='error'>Rozmiar wybranego obrazu przekracza limit ustawiony w php.ini</div>";
  6. case UPLOAD_ERR_FORM_SIZE:
  7. print "<div class='error'>Rozmiar wybranego obrazu przekracza limit ustawiony w formularzu</div>";
  8. case UPLOAD_ERR_PARTIAL:
  9. print "<div class='error'>Wybrany obraz nie został wysłany w całości</div>";
  10. case UPLOAD_ERR_NO_FILE:
  11. print "<div class='error'>Nie wysłano obrazu</div>";
  12. case UPLOAD_ERR_NO_TMP_DIR:
  13. print "<div class='error'>Wystąpił problem ze znalezieniem folderu tymczasowego</div>";
  14. case UPLOAD_ERR_CANT_WRITE:
  15. print "<div class='error'>Wystąpił błąd podczas zapisu obrazu</div>";
  16. case UPLOAD_ERR_EXTENSION:
  17. print "<div class='error'>Wysyłanie obrazu zostało wstrzymane</div>";
  18. default:
  19. print "<div class='error'>Wystąpił nieokreślony błąd</div>";
  20. }
  21. }else{
  22. $biala_lista = array("image/gif", "image/png", "image/jpeg", "image/pjpeg");
  23. if( in_array($_FILES["file"]["type"], $biala_lista) ){
  24. if( ($_FILES["file"]["size"] < 20000) ){
  25. $rozdzielczosc = getimagesize($_FILES["file"]["tmp_name"]);
  26. if( ($rozdzielczosc[0] <= 60) && ($rozdzielczosc[1] <= 45) ){
  27. $typ_pliku = strip_tags($_FILES["file"]["name"]);
  28. $typ_pliku = explode(".", $typ_pliku);
  29. $biala_lista = array("gif", "png", "jpeg", "jpg");
  30. if( in_array($typ_pliku[1], $biala_lista) ){
  31. $nazwa_pliku = md5(uniqid(rand(), true));
  32. $nazwa_pliku = $nazwa_pliku.".".$typ_pliku[1];
  33. echo "$nazwa_pliku<br>";
  34. echo "Type: " . $_FILES["file"]["type"] . "<br>";
  35. echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br>";
  36. move_uploaded_file($_FILES['file']['tmp_name'], "temp/".$nazwa_pliku);
  37.  
  38. $ftp = ftp_ssl_connect("adres") or die("Nie można nawiązać połączenia z serwerem");
  39. ftp_login($ftp, "login", "haslo");
  40. ftp_pasv($ftp, true);
  41. if( @GetImageSize("http://img.domena.eu/awatary/".$nazwa_pliku) ){
  42. print "<div class='error'>Wystąpił błąd podczas zapisu pliku</div>";
  43. }else{
  44. if( ftp_put($ftp, "/public_html/awatary/".$nazwa_pliku, "temp/".$nazwa_pliku, FTP_BINARY) ){
  45. print "<div class='pass'>Zapisano zmiany</div>";
  46. }else{
  47. print "<div class='error'>Wystąpił błąd podczas przesyłania pliku</div>";
  48. }
  49. }
  50. ftp_close($ftp);
  51.  
  52. }
  53. }else{
  54. print "<div class='error'>Twój awatar nie może być większy niż 60px x 45px</div>";
  55. }
  56. }else{
  57. print "<div class='error'>Waga awatara nie może być większa niż 20KB</div>";
  58. }
  59. }else{
  60. print "<div class='error'>Dozwolone typy plików: gif, png, jpg</div>";
  61. }
  62. }
  63. }
Fifi209
A próbowałeś wysyłać coś innego niż obrazek? Czy też są błędy?
toaspzoo

$ftp = ftp_ssl_connect("adres") or die("Nie można nawiązać połączenia z serwerem");


Jesteś pewien, że twoje konto obsługuje ssl ?

użyj ftp_connect

czyli


$ftp = ftp_connect("adres") or die("Nie można nawiązać połączenia z serwerem");
Fifi209
toaspzoo skoro nie byłoby połączenia, to raczej w ogóle by się nie połączył i nie utworzył żadnego pliku.
kurkusmaximus
Tak, jestem pewien, że mam ssl. Loguję się normalnie.

Przy pomocy move_uploaded_file jestem w stanie zapisać .txt, lecz tym razem put nie tworzy pustego pliku.
Jednak tworzy się pusty plik txt
Fifi209
A może spróbuj przez

file_put_contents ?

Masz jakiś przykład z netu.
kurkusmaximus
Również tworzy plik o wielkości "0"
wizu
Masz włączone pełne wyświetlanie błędów? Może wyrzuca jakieś ostrzeżenia

Spróbuj wstawić na początek skryptu.
kurkusmaximus
Nie ma ostrzeżeń.
wizu
Próbowałeś ściągnąć na dysk dany plik i ręcznie wrzucić go na ftp przy pomocy jakiegoś klienta ftp? Spróbuj zalogować się na tego użytkownika, którym logujesz się w php.
kurkusmaximus
Tak, nie mam problemów z logowaniem tylko z zapisem pliku.
Próbowałem już chyba wszystkiego. Nie ma na to lekarstwa?
wizu
Nie chodzi mi o logowanie, tylko o samo wrzucenie pliku. Jeśli przez klienta ftp dasz radę wrzucić, to wykluczymy w tym momencie wszystkie zewnętrzne możliwe problemy, np. brak uprawnień. Pozostanie tylko kombinowanie po stronie php, ale przynajmniej to będzie jasne.
Fifi209
Ja ogólnie bym troszkę inaczej do tego podszedł, wyskrobałem na podstawie Twojego kodu coś takiego:
  1. $file = $_FILES['file'];
  2. if (!isset($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) {
  3. die('<div class="error">Wystąpił błąd podczas przesyłania pliku</div>');
  4. }
  5.  
  6. if ($file['error'] > 0) {
  7. $errs = array(
  8. UPLOAD_ERR_INI_SIZE => 'Rozmiar wybranego obrazu przekracza limit ustawiony w php.ini',
  9. UPLOAD_ERR_FORM_SIZE => 'Rozmiar wybranego obrazu przekracza limit ustawiony w formularzu',
  10. UPLOAD_ERR_PARTIAL => 'Wybrany obraz nie został wysłany w całości',
  11. UPLOAD_ERR_NO_FILE => '>Nie wysłano obrazu',
  12. UPLOAD_ERR_NO_TMP_DIR => 'Wystąpił problem ze znalezieniem folderu tymczasowego',
  13. UPLOAD_ERR_CANT_WRITE => 'Wystąpił błąd podczas zapisu obrazu',
  14. UPLOAD_ERR_EXTENSION => 'Wysyłanie obrazu zostało wstrzymane'
  15. );
  16.  
  17. if (in_array($file['error'], $errs)) {
  18. echo '<div class="error">'.$errs[$file['error']].'</div>';
  19. }else{
  20. echo '<div class="error">Wystąpił nieokreślony błąd</div>';
  21. }
  22. }
  23.  
  24. $typ = array('image/gif', 'image/png', 'image/jpeg', 'image/pjpeg');
  25. if (!in_array($file['type'], $typ)) {
  26. die('<div class="error">Dozwolone typy plików: gif, png, jpg</div>');
  27. }
  28.  
  29. if ($file['size'] > 20000) {
  30. die('<div class="error">Waga awatara nie może być większa niż 20KB</div>');
  31. }
  32.  
  33. $rozdz = getimagesize($file['tmp_name']);
  34.  
  35. if ($rozdz[0] > 60 || $rozdz[1] > 45) {
  36. die('<div class="error">Twój awatar nie może być większy niż 60px x 45px</div>');
  37. }
  38.  
  39. $roz = array('gif', 'png', 'jpeg', 'jpg');
  40. $f_roz = end(explode('.', $file['tmp_name']));
  41.  
  42. if (!in_array($f_roz, $roz)) {
  43. die('<div class="error">Dozwolone typy plików: gif, png, jpg</div>');
  44. }
  45.  
  46. $nazwa = md5(microtime(true)).$f_roz;
  47.  
  48. echo 'Nazwa pliku: '.$nazwa.'<br/>';
  49. echo 'Type: '.$file['type'].'<br/>';
  50. echo 'Size: '.$file['size'];
  51.  
  52. move_uploaded_file($file['tmp_name'], 'temp/'.$nazwa);


Jednak oczywiście nie sprawdzałem, nawet w obecnej chwili nie mam gdzie.
kurkusmaximus
Cytat(wizu @ 18.08.2011, 15:10:41 ) *
Nie chodzi mi o logowanie, tylko o samo wrzucenie pliku. Jeśli przez klienta ftp dasz radę wrzucić, to wykluczymy w tym momencie wszystkie zewnętrzne możliwe problemy, np. brak uprawnień. Pozostanie tylko kombinowanie po stronie php, ale przynajmniej to będzie jasne.

Plik wgrywa się normalnie przez klienta FTP. Zero problemów.
@Fifi209, zaraz sprawdzę kod

Niestety, po podmianie kodu, również pluje 0 bajtowymi plikami.

Admin dodał możliwość kopiowania pliku przez copy() i działa, a dlaczego put nie działa, nie wiadomo...
shpaque
spróbuj zobić coś z tym (to upload do plików nie tylko zdjęć)

  1. <?php
  2. function ValidateEmail($email)
  3. {
  4. $pattern = '/^([0-9a-z]([-.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,6})$/i';
  5. return preg_match($pattern, $email);
  6. }
  7.  
  8. function RecursiveMkdir($path)
  9. {
  10. if (!file_exists($path))
  11. {
  12. RecursiveMkdir(dirname($path));
  13. mkdir($path, 0777);
  14. }
  15. }
  16.  
  17. if($_SERVER['REQUEST_METHOD'] == 'POST')
  18. {
  19. $mailto = 'email@email.pl';
  20. $mailfrom = isset($_POST['email']) ? $_POST['email'] : $mailto;
  21. $subject = 'Dodano nowy plik';
  22. $message = '';
  23. $success_url = '';
  24. $error_url = '';
  25. $error = '';
  26. $eol = "\n";
  27. $max_filesize = isset($_POST['filesize']) ? $_POST['filesize'] * 1024 : 1024000;
  28. $upload_folder = "images";
  29. $upload_folder = "http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['SCRIPT_NAME'])."/".$upload_folder;
  30.  
  31. $boundary = md5(uniqid(time()));
  32.  
  33. $header = 'From: '.$mailfrom.$eol;
  34. $header .= 'Reply-To: '.$mailfrom.$eol;
  35. $header .= 'MIME-Version: 1.0'.$eol;
  36. $header .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'.$eol;
  37. $header .= 'X-Mailer: PHP v'.phpversion().$eol;
  38. if (!ValidateEmail($mailfrom))
  39. {
  40. $error .= "The specified email address is invalid!\n<br>";
  41. }
  42.  
  43. $prefix = rand(111111, 999999);
  44.  
  45. $i = 0;
  46. while (list ($key, $val) = each ($_FILES))
  47. {
  48. if ($_FILES[$key]['name'] != "" and file_exists($_FILES[$key]['tmp_name']) and $_FILES[$key]['size'] > 0)
  49. {
  50. $upload_DstName[$i] = $prefix . "_" . str_replace(" ", "_", $_FILES[$key]['name']);
  51. $upload_SrcName[$i] = $_FILES[$key]['name'];
  52. $upload_Size[$i] = ($_FILES[$key]['size']);
  53. $upload_Temp[$i] = ($_FILES[$key]['tmp_name']);
  54. $upload_Type[$i] = ($_FILES[$key]['type']);
  55. $uploadlink[$i] = "$upload_folder/$upload_DstName[$i]";
  56. $upload_fieldname[$i] = $key;
  57. $upload_fieldname_final[$i] = ucwords(str_replace("_", " ", $key));
  58. $fieldvalue[$i] = $uploadlink[$i];
  59. $i++;
  60. }
  61. if ($upload_Size[$i] >= $max_filesize)
  62. {
  63. $error .= "The size of $key (file: $upload_SrcName[$i]) is bigger than the allowed " . $max_filesize/1024 . " Kbytes!\n";
  64. }
  65. }
  66.  
  67. if (!empty($error))
  68. {
  69. $errorcode = file_get_contents($error_url);
  70. $replace = "##error##";
  71. $errorcode = str_replace($replace, $error, $errorcode);
  72. echo $errorcode;
  73. }
  74.  
  75. $uploadfolder = basename($upload_folder);
  76. for ($i = 0; $i < count($upload_DstName); $i++)
  77. {
  78. $uploadFile = $uploadfolder . "/" . $upload_DstName[$i];
  79. if (!is_dir(dirname($uploadFile)))
  80. {
  81. RecursiveMkdir(dirname($uploadFile));
  82. }
  83. else
  84. {
  85. chmod(dirname($uploadFile), 0777);
  86. }
  87. move_uploaded_file($upload_Temp[$i] , $uploadFile);
  88. chmod($uploadFile, 0644);
  89. }
  90.  
  91. $internalfields = array ("submit", "reset", "send", "captcha_code");
  92. $message .= $eol;
  93. $message .= "IP Address : ";
  94. $message .= $_SERVER['REMOTE_ADDR'];
  95. $message .= $eol;
  96. foreach ($_POST as $key => $value)
  97. {
  98. if (!in_array(strtolower($key), $internalfields))
  99. {
  100. if (!is_array($value))
  101. {
  102. $message .= ucwords(str_replace("_", " ", $key)) . " : " . $value . $eol;
  103. }
  104. else
  105. {
  106. $message .= ucwords(str_replace("_", " ", $key)) . " : " . implode(",", $value) . $eol;
  107. }
  108. }
  109. }
  110.  
  111. if (count($upload_SrcName) > 0)
  112. {
  113. $message .= "\nThe following files have been uploaded:\n";
  114. for ($i = 0; $i < count($upload_SrcName); $i++)
  115. {
  116. $message .= $upload_SrcName[$i] . " Link: " . $uploadlink[$i] . "\n";
  117. }
  118. }
  119. $body = 'This is a multi-part message in MIME format.'.$eol.$eol;
  120. $body .= '--'.$boundary.$eol;
  121. $body .= 'Content-Type: text/plain; charset=UTF-8'.$eol;
  122. $body .= 'Content-Transfer-Encoding: 8bit'.$eol;
  123. $body .= $eol.stripslashes($message).$eol;
  124. $body .= '--'.$boundary.'--'.$eol;
  125. mail($mailto, $subject, $body, $header);
  126. header('Location: '.$success_url);
  127. }
  128. ?>



a w formularzu:

  1. <form name="formularz" method="post" action="<?php echo basename(__FILE__); ?>" enctype="multipart/form-data" accept-charset="UTF-8" id="indexForm1">
  2. <input type="file" id="upload" name="upload"/>
  3. </form>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.