图像上传发送数据但没有在接收端创建文件

时间:2017-03-09 13:15:25

标签: php ios swift swift3 urlsession

我被困住了。 并且失去了解决它的方法。 我在iPhone上用Swift发送下面方法的图像。 我可以看到服务器正在使用Wireshark接收数据。 我还可以在php-server的终端上看到我正在接收数据。

我不知道如何处理的数据。

我目前正在使用下面的php脚本来处理上传的所有内容,我会使用很多测试变量来查看是否可以找出我收到的内容。< / p>

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

我不知道如何解决这个问题。我知道数据似乎无法掌握它。我已经尝试了几种方法将其与快速部分一起发送。这个加上另外两个有同样的问题,当我到达php端时,文件名无处可寻,我甚至找不到该文件的临时名称。

请注意,图像数据永远不会保存到iPhone上的文件中,我无意让这种情况发生。我只需要用相机拍摄图像并发送它,我现在已经完成了,但是当我尝试在PHP端保存图像文件时,一切似乎都无法做到。

$ _FILES中没有内容,因为我可以看到内容在$ _REQUEST和文件中,但是当我尝试访问那个时,我只是得到有线标志和问号。

1 个答案:

答案 0 :(得分: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)