2009-08-06 8 views
3

Ich versuche, der Benutzer lädt ein Bild von meinem Facebook-App mit dem folgenden PHPFacebook - nicht lädt Datei mit dem <input type = „file“> Tag

<?php 
echo render_header('Your'); 

define("MAX_SIZE", "1536"); 

function getExtension($str){ 
    $i = strpos($str,"."); 
    if(!$i) {return "";} 
    $l = strlen($str) - $i; 
    $ext = substr($str, $i+1, $l); 
    return $ext; 
} 

$errors = 0; 

if(isset($_POST['Upload'])){ 
    $image = $_FILES["file1"]["name"]; 
    if($image){ 
    $filename = stripslashes($_FILES["file1"]["name"]); 
    $extension = getExtension($filename); 
    $extension = strtolower($extension); 
    if((strcasecmp($extension,"jpg") != 0) && (strcasecmp($extension,"jpeg") != 0) && (strcasecmp($extension,"png") != 0) && (strcasecmp($extension,"gif") != 0)) 
    { 
     $errors = 1; 
    } 
    else{ 
     $size = filesize($_FILES['file1']['tmp_name']); 
     if($size > MAX_SIZE*1024){ 
     $errors = 2; 
     } 
     else{ 
     $image_name = md5(uniqid()) . '.' . $extension; 
     $newname = "../images/" . $image_name; 
     $flName = "/images/" . $image_name; 
     $copied = move_uploaded_file($_FILES['file1']['tmp_name'], $newname); 
     if(!$copied){ 
      $errors = 3; 
     } 
     } 
    } 
    } 
} 

if(isset($_POST['Upload']) && $errors == 0){ 
    //add to database here 
    ... 
    if($errors == 0){ 
    include "uploadedFile.php"; 
    } 
} 
else{ 

$user_details = $fb->api_client->users_getInfo($user, 'first_name,last_name,pic_square'); 
$image_url = $user_details[0]['pic_square']; 
if($image_url == ""){ 
    $image_url = "http://static.ak.fbcdn.net/pics/q_silhouette.gif"; 
} 
$user_name = $user_details[0]['first_name'] . " " . $user_details[0]['last_name']; 
if(isset($_POST['Upload']) && $errors == 0){ 
?> 
<div id="error" class="error"> 
<h2 id="standard_error" name="standard_error">Failed to upload tattoo.</h2> 
<p id="standard_explanation" name="standard_explanation"> 
Error uploading file. This error occurred because either the photo was a size we don't support or there was a problem with the image file. 
<br/> 
</p> 
</div> 
<?php 
} 
?> 
<div id="newalbum" align="center"> 
<form id="upload" enctype="multipart/form-data" name="upload" action="" method="post"> 
<table class="formtable" cellspacing="0" border="0"> 
<tbody> 
<tr class="tallrow"> 
<td class="label"> 
Upload Image: 
<br/> 
<small> 
You can upload 
<br/> 
JPG, GIF or PNG 
<br/> 
files. 
</small> 
</td> 
<td> 
<div id="files"> 
<div id="1"> 
<input id="file1" class="inputfile" type="file" name="file1" size="22"/> 
</div> 
</div> 
</td> 
</tr> 
</tbody> 
</table> 
<div class="formbuttons"> 
<input id="" class="inputbutton" type="submit" value="Upload Tattoo" name="Upload" /> 
<br/> 
<small>The file size limit 1.5 MB. If your upload does not work, try uploading a smaller picture.</small> 
<br/> 
</div> 
<?php 
} 
?> 

zu lassen Aber wenn ich diesen Code ausführen und der Benutzer drückt die Schaltfläche "Hochladen", der Wert von $ _FILES ['Datei1'] ['Name'] erscheint leer.

Ist dieser Code in Facebook-Apps zulässig? Wenn nicht, was ist der richtige Weg, Dateien hochzuladen?

Dank

bearbeiten

Ok so das Problem mit Facebook ist. Sie entfernen alle Datei-Tags von jeder Anfrage! Es wird empfohlen, stattdessen iframes zu verwenden!

Danke für die Hilfe alle!

Antwort

3

Ok. Ich habe das Problem gefunden. Facebook entfernt alle Datei-Tags, bevor eine Anfrage gesendet wird. Die Lösung besteht darin, stattdessen iframes zu verwenden.

+0

Heh. Ich wollte dir das gerade sagen Das gleiche Problem mit meiner eigenen App. Ich denke, das Problem ist, dass normale App-Seiten durch FB gefiltert werden, und sie wollen nicht, dass Benutzer Dateien auf ihre hochladen Server müssen dann die Dateien an Ihren Server übergeben. –

+0

Kann sich jemand darauf auslassen? Bedeutet dies, dass die App im Bereich "App-Einstellungen" als "iframe" oder "fbml" konfiguriert wird, oder heißt das, dass Sie für die gesamte Seite ein aufrufen? Oder nur für das Formular? Ich hätte auch gerne dieses Problem für mich gelöst! –

+0

Sie können den HTML-Code, der das Formular enthält, einfach in einen Iframe einfügen. So habe ich es funktioniert. – lostInTransit

1

Bevor Sie versuchen, den Dateinamen zugreifen zu können, versuchen Sie dies ...

switch ($_FILES['file1']['error']) { 
    case UPLOAD_ERR_INI_SIZE: 
    echo '<p class="warning">File Upload Failed! File too large.</p>'; 
    break; 
    case UPLOAD_ERR_FORM_SIZE: 
    echo '<p class="warning">File Upload Failed! File exceeds limit.</p>'; 
    break; 
    case UPLOAD_ERR_PARTIAL: 
    echo '<p class="warning">File Upload Failed! Please try again.</p>'; 
    break; 
    case UPLOAD_ERR_NO_TMP_DIR: 
    echo '<p class="warning">File Upload Failed! No temp directory.</p>'; 
    break; 
    case UPLOAD_ERR_CANT_WRITE: 
    echo '<p class="warning">File Upload Failed! Failed to write to disk.</p>'; 
    break; 
    case UPLOAD_ERR_EXTENSION: 
    echo '<p class="warning">File Upload Failed!</p>'; 
    break; 
} 

Dies sollte Ihnen sagen, wo das Problem liegt.

+1

Auch das kann oben nicht schaden: ini_set ('display_errors', '1'); error_reporting (E_ALL); Nimm es raus wenn es richtig live geht. – MSpreij

+0

versuchte dies. Es geht in keinen der Schalterfälle. Also gibt es keine Fehler :(Gibt es eine Einschränkung bei der Verwendung von Dateieingaben in Facebook? – lostInTransit

+0

MSpreji, habe ich versucht, diese Aussage zu addieren, gibt es den Fehler "Undefined index: file1". Warum würde es das tun ?! Ich habe eine Dateieingabe Typ mit dem Namen "file1" – lostInTransit

0

Ihr HTML-Markup hat kein Formular-End-Tag.

<form> 

</form> 

Auch Aktion Ihre Formulars sollte entweder auf sich selbst oder die Seite, die die Bildverarbeitung behandelt (In Ihrem Fall die gleiche Datei)

<?php 
echo("<form id=\"formid\" name=\"formid\" method=\"post\" action=\"".$PHP_SELF."\" 

</form>"); 
?> 
+0

Beide hinzugefügt, aber ich bekomme immer noch einen Fehler bei der Verwendung der Ini-Anweisung MSpreji hatte - Undefined index: file1 – lostInTransit

+0

Versuchen Sie einen einfachen Test dann. Erstellen Sie Ihr Formular mit 1 Dateifeld, und nach dem Posten Verwenden Sie print_r ($ _ FILES), um zu sehen, ob die Info übergeben wird oder nicht Wenn dies auch nicht funktioniert, gibt es eine Servereinstellung, die Dinge auf den Kopf stellt – Coreus

Verwandte Themen