2017-03-09 4 views
0

私は立ち往生しています。 とそれを解決するために何をするかで失われました。 iPhoneからSwiftで以下の方法で画像を送信しています。 そして、Wiresharkを使ってサーバーがデータを受信して​​いるのがわかります。 私はまた、私がデータを受け取っているというPHPサーバの端末で見ることができます。画像アップロードでデータが送信されましたが、受信側でファイルが作成されていません

どのように処理するのかわからないデータです。

私は現在、アップロードですべてを処理するために、以下のPHPスクリプトを使用しています。私が何かを受け取っていたかどうかを知るために使用しているテスト変数がたくさんあります。

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" 

]); 
} 
?> 

と私は変数がどのような含まれているかを把握するために、この種のコードを使用しています。

$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"); 
    } 

これを解決する方法はわかりません。私はデータがそこにあることを知っているだけでそれを保持するように見えることはできません。私は迅速な部分でそれを送るためにいくつかの方法を試しました。この1つに加えて2つの他のものは私がPHP側に到達したときに同じ問題を抱えていました。ファイル名が見つからず、ファイルの一時名も見つけられませんでした。

画像データは決してiPhone上のファイルに保存されていないことに注意してください。私は単にカメラで画像を撮って送信するだけで済みますが、私はこれを達成しましたが、PHP側で画像ファイルを保存しようとすると、一見不可能に見えます。

コンテンツは$ _REQUESTとファイル内にある限り見ることができますが、そのファイルにアクセスしようとすると、有線のサインと疑問符が表示されます。

答えて

0

私はこれを最終的に解決しました。私の問題は、各要求で同じ境界を使用するのではなく、新しい境界を生成することでした。 と同様に、私はmultipart/form-dataをリクエストのContent-Typeに追加するのを忘れていました。 上記の私のcreateBodyWithParametersの最後にも注意してください。私はそれらを誤って削除したことで明らかに重要です。

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) 
関連する問題