尝试将C++代码移植到服务器以将文件上传到Objective-C,但它不起作用

Trying to port C++ code to upload a file to the server into Objective-C, but it's not working

本文关键字:Objective-C 不起作用 文件 服务器 C++ 代码      更新时间:2023-10-16

为了将文件上传到服务器,我有以下PHP脚本:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png", "txt");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "text/plain"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>

我的朋友正在使用这个C++代码将图像POST到服务器:

void CNetworkManager::doUpload(const QUrl& url, QString fileName)
{
QString path(fileName);
QNetworkRequest request(url);
QString bound="margin";
QByteArray data(QString("--" + bound + "rn").toLatin1());
data.append("Content-Disposition: form-data; name="action"rnrn");
data.append(url.toString() + "rn");
data.append("--" + bound + "rn");
data.append("Content-Disposition: form-data; name="file"; filename="://resources/images/heart.png"rn");
data.append("Content-Type: image/pngrnrn");
QFile file(path);
if (!file.open(QIODevice::ReadOnly))
return;
data.append(file.readAll());
data.append("rn");
data.append("--" + bound + "--rn");
request.setRawHeader(QString("Content-Type").toLatin1(),QString("multipart/form-data; boundary=" + bound).toLatin1());
request.setRawHeader(QString("Content-Length").toLatin1(), QString::number(data.length()).toLatin1());
_uploadManager.post(request,data);
}

我正试图在Objective-C中模仿它,这样我就可以在Mac应用程序中做同样的事情,并上传txt文件:

NSString *url = @"";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
request.HTTPMethod = @"POST";
NSString *boundary = @"ghfd67df7gsfd67676gasgd";
NSString *headerFieldValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:headerFieldValue forHTTPHeaderField:@"Content-Type"];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [NSString stringWithFormat:@"%@/textfile.txt", documentsDirectory];
NSString *content = @"Lorem ipsum dolor sit amet.";
[content writeToFile:fileName
atomically:NO
encoding:NSStringEncodingConversionAllowLossy
error:nil];
NSMutableData *postData = [[[NSString stringWithFormat:@"rn--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="action"rnrn"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"%@rn", url] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="userfile"; filename="%@"rn", fileName] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: text/plainrnrn" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSFileManager defaultManager] contentsAtPath:fileName]];
[postData appendData:[[NSString stringWithFormat:@"rn--%@--rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
request.HTTPBody = postData;
[request addValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@", response);
}];

但不管出于什么原因,它似乎都不起作用。我试图将C++语句转换为Objective-C语句,但该文件从未出现在服务器上。

我做错了什么?

您上面的代码工作正常,问题是您没有正确命名表单字段。

[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="userfile"; filename="%@"rn", fileName] dataUsingEncoding:NSUTF8StringEncoding]];

该行列出的表单字段名称为userfile,而C++代码为

data.append("Content-Disposition: form-data; name="file"; filename="://resources/images/heart.png"rn");

将表单字段列为file。当您上传时,这将导致一个问题,因为服务器需要一个名为file而不是userfile的字段。