图片上传发送数据但接收端没有创建文件
Image upload sends the data but no file created on received end
我卡住了。
并不知道如何解决它。
我正在使用 Swift 中的以下方法从 iPhone 发送图像。
我可以看到服务器正在使用 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---"
}
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");
}
我不知道如何解决这个问题。我知道那里的数据似乎无法掌握。我已经尝试了几种方法来使用 swift 部分发送它。当我到达 php 一侧时,这一个加上另外 2 个遇到了同样的问题,找不到文件名,我什至找不到文件的临时名称。
请注意,图像数据永远不会保存到 iPhone 上的文件中,我无意让这种情况发生。我只需要用相机拍摄图像并发送它,我现在已经完成了,但是当我尝试在 PHP 端保存图像文件时,一切似乎都变得不可能。
据我所知,$_FILES 中没有任何内容,内容在 $_REQUEST 以及文件中,但是当我尝试访问那个文件时,我只看到有线符号和问号。
我最终确实解决了这个问题。我的问题是我生成了一个新的边界,而不是在每个请求中使用相同的边界。
以及我忘记将 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)
我卡住了。 并不知道如何解决它。 我正在使用 Swift 中的以下方法从 iPhone 发送图像。 我可以看到服务器正在使用 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---"
}
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");
}
我不知道如何解决这个问题。我知道那里的数据似乎无法掌握。我已经尝试了几种方法来使用 swift 部分发送它。当我到达 php 一侧时,这一个加上另外 2 个遇到了同样的问题,找不到文件名,我什至找不到文件的临时名称。
请注意,图像数据永远不会保存到 iPhone 上的文件中,我无意让这种情况发生。我只需要用相机拍摄图像并发送它,我现在已经完成了,但是当我尝试在 PHP 端保存图像文件时,一切似乎都变得不可能。
据我所知,$_FILES 中没有任何内容,内容在 $_REQUEST 以及文件中,但是当我尝试访问那个文件时,我只看到有线符号和问号。
我最终确实解决了这个问题。我的问题是我生成了一个新的边界,而不是在每个请求中使用相同的边界。 以及我忘记将 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)