尝试将C++代码移植到服务器以将文件上传到Objective-C,但它不起作用
Trying to port C++ code to upload a file to the server into Objective-C, but it's not working
为了将文件上传到服务器,我有以下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
的字段。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 当两个相等的双精度的相对比较不起作用时,我该怎么办?
- Objective-C协议代表不起作用
- ARC 在 Objective-C++ 中不起作用
- 当qt插件在Windows中不起作用时,如何在eclipse cdt中创建qt应用程序
- 尝试将C++代码移植到服务器以将文件上传到Objective-C,但它不起作用
- 当显式转换是必需的并且隐式转换将不起作用时
- 当 COUT 不起作用时,如何检测无限循环?
- 当内部作用域名称不起作用时,为什么编译器不采用命名空间名称?
- Visual Studio 2010 - MS C++ (CL) 编译的可执行文件在 Windows 2000 上不起作
- 从 Objective-C 函数调用C++函数不起作用