Italian [RISOLTO] Invio JPG a WebServer

zakker

Member
Licensed User
Ciao,
avrei la necessità di fare un upload di un'immagine acquisita con fotocamera del cellulare su mio WebServer.
Ci sarebbe un PHP che dovrebbe "gestire" il file ricevuto.

Qualcuno ha esperienze?

Ho provato con PostFile e PostMultipart, guardando qualche esempio...ma non sono riuscito...
Qualcuno ha qualche esempio sia B4A che del "corrispondente" file PHP sul server?

Grazie per l'aiuto
 

zakker

Member
Licensed User
Che tipo di server hai windows / linux ?? Hai provato QUESTO ??

il server è Windows con Apache e PHP .

Quell'esempio l'avevo già visto ma non sono riuscito a far funzionare la cosa...per questo chiedevo se qualcuno l'avesse già provato per potermi spiegare :)
 

sirjo66

Well-Known Member
Licensed User
Longtime User
io mi concentrerei su PostFile, quali sono gli esempi che hai trovato ??
 

sirjo66

Well-Known Member
Licensed User
Longtime User
la parte del PostFile è semplice, ma anche quella dalla parte del PHP non mi sembra difficile, eccoti il codice che uso sul mio sito, dovrebbe andar bene anche a te, ovviamente la prima riga devi modificarla impostando la cartella corretta dove deve mettere i files:
B4X:
<?php
$target_dir = "tvrun/img/";
$target_file = $target_dir . basename($_FILES["upload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["upload"]["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["upload"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

echo $_FILES["upload"]["size"]."<br/>";


// 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 {
   //echo "<br />Tutto OK";
  if (move_uploaded_file($_FILES["upload"]["tmp_name"], $target_file)) {
  echo "The file ". basename( $_FILES["upload"]["name"]). " has been uploaded.";
  } else {
  echo "Sorry, there was an error uploading your file.";
  }
}
?>

ovviamente devi rispettare il $_FILES["upload"] nella tua pagina di caricamento, ad esempio:
B4X:
<form enctype="multipart/form-data" action="upload.php" method="POST">
Invia questo file: <input name="upload" type="file"></br>
<input type="submit" value="Invia File">
</form>

ti consiglio quindi prima di tutto di sistemare il codice PHP sul server, poi di creare una pagina HTML per provare a caricare i file, e quando sei sicuro che funziona fai il codice sul B4A

Sergio
 
Last edited:

valentino s

Active Member
Licensed User
Longtime User
inoltre nell'html puoi specificare una dimensione massima: maxsize.

Tuttavia qualche dispettoso potrebbe mandarti un file enorme mettendo l'html modificato altrove.

Per questo php ha un limite massimo. Io ricordo 5mb (che potrebbe creare problemi con le dimensioni delle attuali foto). A seconda del fornitore di hosting devi agire su php.ini o con i php ini set (non ricordo la sintassi esatta) per aggirare i limiti di default di php.

In ogni caso prima di usare il file controlla tipo e dimensioni. Il tipo, ahime', non e' uno standard. Ma controlla le dimensioni sempre e comunque per evitare che ti riempiano il server.

Attenzione: in php devi modificare sia la dimensione del file massima in upload che la dimensione massima di dati che possono essere passati via in $POST.
post_max_size = 3M
upload_max_filesize = 64M

E probabilmente anche il timeout:
max_execution_time = 120
max_input_time = 60


Il funzionamento di php e' semplice: il file viene caricato in una temp folder, da li' lo muovi deve serve. Tutti i dati del file uploadato sono nella $_FILES["nome scelto nell'html"]:

move_uploaded_file($_FILES["upload"]["tmp_name"], $target_file

Esistono poi trucchi per avviare l'upload subito dopo aver scelto il file, senza bisogno di cliccare submit (tipo: onchange="submit()" (pseudocode controlla sul web).

Invece a me servirebbe di piu' come lo mandi dalla app. httputils2 immagino. Riesci a condividere almeno la parte centrale del codice ?

Ecco quello che uso quasi sempre:

B4X:
<script>
function loadfile() {
document.getElementById("submit").style.background = "#33ff33";
document.getElementById("photo").style.visibility = "hidden";
document.getElementById("loading").style.visibility = "yes";
}
</script>

<form enctype="multipart/form-data" action="index.php" method="POST">
<input type=hidden value=sara name=pwd>
<input type="hidden" name="MAX_FILE_SIZE" value="80000000" />
<input name="photo" accept="image/*;capture=camera" size=30 type="file" onchange="loadfile();this.form.submit();">
<input type="submit" value="Upload File" class=cmdflat style="display:none;" />
<img src=img/loading.gif id=loading width=20 height=20 style="visibility:hidden;vertical-align:middle;" ></form>
 

zakker

Member
Licensed User
Quegli esempi li avevo giá trovati e provati. Il webserver é mio quindi gestisco tutto io...php.ini é ok.

Il problema é che, come ho letto in qualche post di Erel, con il PostFile non viene "riempita"la variabile $_FILES per cui tutto quel codice php va a farsi benedire :( ... E diceva di usare il Multipart
 

sirjo66

Well-Known Member
Licensed User
Longtime User
fammi capire quanti byte potrebbe essere al massimo grande questo file che devi inviare

potresti costruirti tu il comando POST e poi inviarlo al webservice, non è molto complicato

Oppure (meglio ancora) leggi il tuo file JPG e lo porti in Base64, poi crei una semplice stringa POST e lo passi con PostString

Nel codice PHP leggi la variabile $_POST e lo ritrasformi da Base64 a byte e lo salvi

Sergio
 
Last edited:

valentino s

Active Member
Licensed User
Longtime User

zakker

Member
Licensed User
fammi capire quanti byte potrebbe essere al massimo grande questo file che devi inviare

potresti costruirti tu il comando POST e poi inviarlo al webservice, non è molto complicato

Oppure (meglio ancora) leggi il tuo file JPG e lo porti in Base64, poi crei una semplice stringa POST e lo passi con PostString

Nel codice PHP leggi la variabile $_POST e lo ritrasformi da Base64 a byte e lo salvi

Sergio

come dimensione immagine direi sui 3mb...
 

tigrot

Well-Known Member
Licensed User
Longtime User
In effetti è la soluzione migliore. Occorre più traffico, ma funziona. Io utilizzo FTP con server IIS Windows e FTP usa un sistema simile. In questo caso FTP è molto stabile e garantisce la massima accessibilità in multiutenza.
Ciao!
 
Top