I have the following PHP script that I POST to in order to upload files to my server:
<?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";
}
?>
And my friend is using this C++ code to POST images to the server:
void CNetworkManager::doUpload(const QUrl& url, QString fileName)
{
QString path(fileName);
QNetworkRequest request(url);
QString bound="margin";
QByteArray data(QString("--" + bound + "
").toLatin1());
data.append("Content-Disposition: form-data; name=\"action\"
");
data.append(url.toString() + "
");
data.append("--" + bound + "
");
data.append("Content-Disposition: form-data; name=\"file\"; filename=\"://resources/images/heart.png\"
");
data.append("Content-Type: image/png
");
QFile file(path);
if (!file.open(QIODevice::ReadOnly))
return;
data.append(file.readAll());
data.append("
");
data.append("--" + bound + "--
");
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);
}
And I'm trying to mimic it in Objective-C so I can do the same thing in a Mac app and upload txt files:
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:@"
--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"action\"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"%@
", url] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"
", fileName] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: text/plain
" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSFileManager defaultManager] contentsAtPath:fileName]];
[postData appendData:[[NSString stringWithFormat:@"
--%@--
", 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);
}];
But for whatever reason it doesn't seem to work. I tried to convert the C++ statements into their Objective-C counterparts, but the file never appears on the server.
What am I doing wrong?