2009-10-16 8 views
4

Je voudrais télécharger un fichier à partir d'un formulaire html, l'envoyer en PHP et le charger en mémoire, sans passer par l'écriture dans un fichier. Est-il possible de faire un téléchargement de fichier et de le garder en mémoire, ou dois-je l'écrire dans un fichier?PHP File upload to memory

+1

Il semble trop de puissance requise pour l'humble PHP. – Ismael

Répondre

2

Je ne pense pas que ce soit possible maintenant. Vous ne pouvez pas utiliser php: // input avec enctype = "multipart/form-data", ce qui exclut l'ouverture du fichier à partir d'un flux. Si vous allez sur la route de publication, vous pouvez seulement utiliser la variable $ _FILE, qui ne contient aucune donnée binaire, juste le pointeur vers le fichier sur le disque.

Il semble que xforms aidera (http://www.ibm.com/developerworks/xml/library/x-xformstipuploadphp/index.html), mais c'est même dans Firefox 3.5. Il nécessite un plug-in, ce qui est un tueur d'affaire pour moi.

+0

Attendez-vous que les gens puissent télécharger des fichiers en utilisant un navigateur Web? Parce que vous pouvez avoir de la difficulté à trouver des navigateurs qui prennent en charge PUT. –

+0

http://stackoverflow.com/questions/165779/are-the-put-delete-head-etc-methods-available-in-most-web-browsers –

+0

Une alternative consiste à utiliser une implémentation côté serveur de XForms (par exemple l'open source http://www.orbeon.com/). De cette façon, vous pouvez prendre en charge tous les navigateurs sans nécessiter l'installation d'extensions, et vous pouvez gérer le téléchargement de la manière que vous décrivez. Bien sûr, à mon humble avis cela n'a de sens que si vous avez besoin d'autres fonctionnalités de XForms, en plus du téléchargement de fichiers. – avernet

0

Puisque PHP ne gère pas les requêtes HTTP elles-mêmes (c'est le travail du serveur web), je ne peux pas imaginer que cela soit possible. Ce serait génial si quelqu'un pouvait me prouver le contraire.

+0

certainement pas possible en utilisant les procédures PHP standard. – dusoft

+0

PHP a un paramètre "upload_tmp_dir", qui contrôle où vont les fichiers téléchargés. Donc, il semble qu'il a un certain contrôle. –

+0

Ouais c'est intéressant. J'imagine que ça dit juste à Apache, "yo, mets ces gars là!" – Kai

2

L'option PUT est cool. Si vous voulez utiliser POST et $ _FILES, je pense que le plus proche que vous pourriez obtenir serait de pointer upload_tmp_dir sur un disque virtuel.

+0

Je suis cool avec put, est-ce que quelqu'un a un exemple complet de faire cela avec put? – CLJ

0

Http put est facile en PHP.

<?php 
$f = fopen('php://input','r'); 
$content =''; 
while(!feof($f)){ 
    $content .= fread($f,8192); 
} 
?> 

$ content est le contenu du fichier. N'oubliez pas de configurer d'abord le serveur Web pour gérer la requête HTTP PUT.

2

je fait face au problème récemment et enfin utiliser la solution suivante: (pas sûr si elle est réellement résoudre le problème, je vais vraiment apprécier votre suggestion)

côté client,

tête d'envoi avec " Content-Type: application/octet-stream; " au lieu de "multipart/form-data"

de sorte que le fichier de téléchargement ne sera pas enregistré dans temp dir sur le serveur.

prendre des Objective-C Code par exemple ios:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"your server address"]]; 
    [request setTimeoutInterval:30]; 
    [request setHTTPMethod:@"POST"]; 

    // set Content-Type in HTTP header 
    NSString *contentType = [NSString stringWithFormat:@"application/octet-stream;"]; 
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    // post body 
    NSMutableData *body = [NSMutableData data]; 

    //yourData is typed NSData here 
    [body appendData:yourData]; 

    // setting the body of the post to the reqeust 
    [request setHTTPBody:body]; 

    // set the content-length 
    NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 


    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id result) { 
      success(result); 
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id result){ 
     failure(error, result); 
    }]; 
    [operation start]; 

côté serveur,

utilisation "php: // input" pour récupérer le fichier sous forme de données brutes (notez que php: // entrée ne fonctionnera pas sur "multipart/form-data")

par exemple: $data = file_get_contents('php://input');

$ data ici sera le fichier téléchargé.


Dans notre cas, la fréquence de téléchargement de fichiers est assez élevée. Il est donc préférable de réduire le fonctionnement du système de fichiers.

0

Vous pouvez pointer le dossier de téléchargement vers un volume tmpfs si sous Linux, il sera en mémoire, même si vous utilisez l'interface du système de fichiers.