2017-03-09 4 views
0

Je suis coincé. et perdu à quoi faire pour le résoudre. J'envoie une image avec les méthodes ci-dessous dans Swift à partir d'un iPhone. Et je peux voir les données sont reçues par le serveur avec Wireshark. Je peux aussi voir dans le terminal du serveur php que je reçois des données.Le téléchargement d'image envoie les données mais aucun fichier créé à la fin reçue

ce sont des données que je ne sais pas comment gérer. J'utilise actuellement le script php ci-dessous pour gérer tout ce qui concerne le téléchargement. Il y a beaucoup de variables de test que j'utilise pour voir si je pouvais savoir ce que je recevais.

public func post(data: Data, url: URL) 
    { 
     var request = URLRequest(url: url) 
     //request.addValue("filenameTest.jpg", forHTTPHeaderField: "filename") 
     request.httpMethod = "POST" 
     let body = createBodyWithParameters(filePathKey: "filenameTest.jpg",data: data,boundary: generateBoundaryString()) 
     request.setValue("Keep-Alive", forHTTPHeaderField: "Connection") 
     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration,delegate: self, delegateQueue: OperationQueue.main) 
     let task = session.uploadTask(with: request as URLRequest, from: body) 
     task.resume() 

    } 
func createBodyWithParameters(filePathKey: String?, data: Data!, boundary: String) -> Data { 
     var body = Data(); 

     let mimetype = "image/jpg" 

     body.append(Data("--\(boundary)\r\n".utf8)) 
     //body.append(Data("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(parameters!["filename"]!)\"\r\n".utf8)) 
     body.append(Data("Content-Disposition: form-data; filename=\"\(filePathKey!)\"\r\n".utf8)) 
     body.append(Data("Content-Type: \(mimetype)\r\n\r\n".utf8)) 


     body.append(data) 
     body.append(Data("\r\n".utf8)) 

     body.append(Data("--\(boundary)--\r\n".utf8)) 

     return body 
    } 
    func generateBoundaryString() -> String { 
     return "----Boundary---" 
    } 

Wireshark

Requested: ??~?3?<??6??Ns?i|2?~`kxB?;??N???$_?|?9?: 

Requested: ???c?S?Y?Gn8>?5?k???y?H??3?N:???????M?_?r??q????~??O?6?Pc?]%"d??x??u?: 

Requested: ??mRKmS????: 

Requested: ????~k]?~}t?E??EO???????'???-????????$?W??|_?Wsl???f???n?:?Q????_?_???_?_2c_8?S?c?: 

Requested: ?????#?: 

Requested: 
[Thu Mar 9 13:55:51 2017] 192.168.250.101:55327 [200]:/




<?php 




$target_dir = "wp-content/uploads"; 

if(!file_exists($target_dir)) 
{ 
mkdir($target_dir, 0777, true); 
} 

$target_dir = $target_dir . "/" . basename($_SERVER['HTTP_FILENAME']); 




if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) { 
echo json_encode([ 
"Message" => "The file ". basename(header('filename')). " has been uploaded.", 
"Status" => "OK" 
]); 

} else { 

echo json_encode([ 
"Message" => "Sorry, there was an error uploading your file.", 
"Status" => "Error" 

]); 
} 
?> 

et j'utilise ce genre de code pour déterminer quelles variables contiennent ce.

$testvar = $_SERVER['HTTP_FILENAME']; 
    file_put_contents("php://stdout", "\nRequested : $testvar /r/n"); 
    $testvar = count($_REQUEST); 
    $testvar = $_REQUEST[3]; 
    file_put_contents("php://stdout", "\nRequested : $testvar /r/n"); 
    foreach($_FILES['file'] as $value){ 
    $testvar = ": ". $value; 
    file_put_contents("php://stdout", "\nRequested: $testvar \r\n"); 
    } 

Je ne sais pas comment résoudre ce problème. Je sais que les données sont là ne peuvent pas sembler en avoir. J'ai essayé plusieurs façons de l'envoyer avec la partie rapide. celui-ci et 2 autres ont eu le même problème quand je suis arrivé au côté php, le nom de fichier était introuvable et je ne pouvais même pas trouver le nom temporaire du fichier.

Notez que les données d'image ne sont jamais enregistrées dans un fichier sur l'iPhone et je n'ai pas l'intention de laisser cela se produire. Je dois simplement prendre une photo avec l'appareil photo et l'envoyer, je l'ai déjà fait mais quand j'essaie de sauvegarder un fichier image du côté PHP, tout devient apparemment impossible à faire.

il n'y a pas de contenu dans $ _FILES pour autant que je puisse voir le contenu dans le $ _REQUEST ainsi que le fichier, mais quand j'essaie d'accéder à celui-ci, je reçois des signes et des points d'interrogation.

Répondre

0

J'ai résolu cela finalement. Mon problème était que je générais une nouvelle frontière au lieu d'utiliser la même limite dans chaque requête. ainsi que j'ai oublié d'ajouter les multipart/form-data au Content-Type de la requête. Notez également le - à la fin de mes createBodyWithParameters ci-dessus .. ils sont apparemment importants que j'ai découvert en les enlevant accidentellement.

let boundary = generateBoundaryString() 

     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
     let body = createHttpBody(filename:"filenametest.jpg" , objData: objData,boundary: boundary)