dongqiao6730 2014-01-28 16:50
浏览 63
已采纳

尝试移植C ++代码以将文件上传到服务器到Objective-C,但它无法正常工作

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?

  • 写回答

1条回答 默认 最新

  • dou44481 2014-01-29 04:49
    关注

    Your code above is working properly, the problem is you have not named the form field correctly.

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

    That line lists the form field name as userfile, while the C++ code:

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

    lists the form field as file. This will cause a problem when you upload as the server is expecting a field named file, not userfile.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算