为什么 NSURLSession uploadTaskWithRequest:fromData: 无法上传到 php 服务器?

2024-04-25

php 代码工作正常。我已经从同一服务器上的 html 表单上传了文件。上传的文件大小从 40K 到 2.0M 不等,因此其大小不高。在运行 PHP 5.3 的服务器上激活文件上传

我发现了很多这样的帖子(还没有答案):https://stackoverflow.com/questions/19710388/using-nsurlsession-to-upload-an-image https://stackoverflow.com/questions/19710388/using-nsurlsession-to-upload-an-image.

这个使用 uploadTask With Request:from File: 而不是表单数据:NSURLSession 确保上传有效 https://stackoverflow.com/questions/23549635/nsurlsession-make-sure-upload-worked

这是 NSURLSessionDataTask 而不是 uploadTaskWithRequest:NSURLSession 没有接收数据 https://stackoverflow.com/questions/22914877/no-data-receiving-with-nsurlsession

有些帖子似乎说 uploadTaskWithRequest:fromData: 根本不起作用:NSURLSession:通过后台传输上传资产 https://stackoverflow.com/questions/19985353/nsurlsession-uploading-assets-with-background-transfer 使用 NSURLSession 异步上传不起作用,但同步 NSURLConnection 可以 https://stackoverflow.com/questions/20893171/asynchronous-upload-with-nsurlsession-will-not-work-but-synchronous-nsurlconnect/20896632?noredirect=1#comment39074802_20896632 and 将图像从 iOS 上传到 PHP https://stackoverflow.com/questions/23667226/upload-image-from-ios-to-php/23682958#comment39072810_23682958

我已经制作了应用程序,使其返回 HTTP 代码,并且我得到代码 200。上传后,服务器 error_log 文件中没有任何内容。一切似乎都工作正常,但无论发生什么,文件都不会写入服务器。我还有什么想法可以尝试找出问题所在吗?

这是 php 代码:

<?php
$file='';
$uploaddir='';

////////////////
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
////////////////

if(isset($_FILES['userfile']['name'])){
      $uploaddir = './photos/'; //Uploading to same directory as PHP file
      $file = basename($_FILES['userfile']['name']);
      echo "file is set";
      $uploadFile = $file;
      $randomNumber = rand(0, 99999); 
      $newName = $uploaddir . $uploadFile;
        if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
            echo "Temp file uploaded. \r\n";
        } else {
            echo "Temp file not uploaded. \r\n";
        }
   if (move_uploaded_file($_FILES['userfile']['tmp_name'], $newName)) {
         $postsize = ini_get('post_max_size'); //Not necessary, I was using these
         $canupload = ini_get('file_uploads'); //server variables to see what was 
         $tempdir = ini_get('upload_tmp_dir'); //going wrong.
         $maxsize = ini_get('upload_max_filesize');
         echo "\r\n" .  $_FILES['userfile']['size'] . "\r\n" . $_FILES['userfile']['type'] ;
    }
}
?>

这是 iOS 代码:

- (void)uploadImage:(UIImage*)image {

    // 0 Define URL
    NSData *imageData = UIImageJPEGRepresentation(image, 0.6);
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.myserver.com/app/photos/uploadPhoto.php"]];
    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *filename = [NSString stringWithFormat:@"someName.jpg"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

    // 4 Create object to put content into...
    NSMutableData *body = [NSMutableData data];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\" filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]];
    //[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    //Not used with this:https://stackoverflow.com/questions/20893171/asynchronous-upload-with-nsurlsession-will-not-work-but-synchronous-nsurlconnect/20896632?noredirect=1#comment39074802_20896632
    //[request setHTTPBody:body];


    __block NSString *stringForText = @"Hola";
    ///////////////////////////////////////////////////
    // 3
    self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // ...
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) response;
        int errorCode = httpResponse.statusCode;
        NSString *errorStatus = [NSString stringWithFormat:@"%d",errorCode];

        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSString *totalResponse = [errorStatus stringByAppendingString:responseString];

        stringForText = totalResponse;
        [self updateView:stringForText];
        //UIAlertView *alertme = [[UIAlertView alloc] initWithTitle:@"error" message:totalResponse delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        //[alertme show];
        // 4
        self.uploadView.hidden = NO;
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    }];


    // 5
    [_uploadTask resume];
}

-(void)updateView:(NSString*)texto{
    dispatch_sync(dispatch_get_main_queue(), ^{
        self.myTextView.text = texto;
    });

}

我对该文件夹有 777 权限。正如我所说,我已经能够通过 html 表单从同一 php 脚本上传并写入该文件夹。

对于 http 错误代码,totalResponse 为 200,对于 php 转储,count=0 以及 array(0) {}。

Here is the image of the response from the server right in the app:enter image description here

我在回显上传的临时文件后添加了这些行:

$body = $HTTP_RAW_POST_DATA;
echo "\n REQUEST" . $body;

但我只得到这个:

file count=1 array(1) { ["user file"]=> array(5) { ["name"]=> string(12) "DrinkCO2.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(14) "/tmp/phpxg7oLZ" ["error"]=> int(0) ["size"]=> int(190550) } } file is setTemp file uploaded. REQUEST 190550 image/png

它没有缺少冒号,而是缺少分号。

"name=\"userfile\" : filename=\"%@\"\r\n""

应该

"name=\"userfile\"; filename=\"%@\"\r\n""

至少这是你的代码对我有用的唯一方法(顺便谢谢!)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 NSURLSession uploadTaskWithRequest:fromData: 无法上传到 php 服务器? 的相关文章

  • 使用数组指针和 swift 1.2 进行 PFSubclassing - 致命错误:NSArray 元素无法匹配 Swift 数组元素类型

    使用 swift 1 2 我无法再检索具有解析子类的指针数组并使用另一个解析子类对其进行向下转换 我总是发现错误 fatal error NSArray element failed to match the Swift Array Ele
  • 推送通知发送成功,但设备收不到(偶尔)

    从昨天开始 我一直遇到一些设备无法收到推送通知的问题 证书 设备令牌似乎是正确的 直到昨天 该设备才能成功接收推送通知 在服务器端 没有错误或连接拒绝 并且推送通知似乎每次都成功发送 但仍然有很多情况下设备无法正确接收推送 一些周边信息 我
  • 推送通知 Drupal 模块 - 删除设备(Web 服务)

    我已经开始使用这个模块 并且我已经成功注册设备 按照他的作者发布的说明进行操作 here http www danielhanold com story drupal 7 push notifications how to register
  • IOS 7 UITextField resignFirstResponder 坏

    当我在自定义单元格内使用 UItextField 时 以及当我 resignFirstResponder 文本字段时 我发生崩溃 但它不再可见 表视图滚动到窗口外 我仍然可以找到文本字段 指针继续可访问 它不为空 并且崩溃仅发生在 IOS7
  • 保存 ScrollViews 位置并稍后滚动回该位置(偏移位置)

    我找到了保存 ScrollViews 的方法offset with a GeometryReader and a PreferenceKey SwiftUI 从 ScrollView 获取当前滚动位置 https stackoverflow
  • Codeigniter-如何在删除index.php后加载新页面

    我是 codeIgniter 的新手 我的索引文件中有一些链接 我已经从 url 中删除了 index php 所以现在 url 看起来像 http localhost app Loader demo page http localhost
  • 故事板中的 Xcode 6 UIVisualEffectView

    我正在 Xcode 6 中的对象库中查找 UIVisualEffectView 以在 Storyboard 中添加模糊效果 我知道如何以编程方式执行此操作 但我找不到在故事板中执行此操作的方法 这在当前的测试版中是否不可用 或者有没有一种不
  • 如何在 PHP 中解密密码哈希?

    我需要解密密码 密码已加密password hash功能 password examplepassword crypted password hash password PASSWORD DEFAULT 现在 我们假设 crypted存储在
  • 在 Codeigniter 中加载 javascript

    对于我们的 Code Igniter 应用程序 我们在结束 body 标记之前加载所有 javascript 所以在我们的控制器中我们有 this gt load gt view head this gt head this gt load
  • iPhone:AVAudioPlayer 不支持的文件类型

    我的应用程序从我们的服务器下载 mp3 并将其播放给用户 该文件为 64 kbps 如果我理解正确的话 这完全在 iPhone 的可接受范围内 我在几十个网站上查找了如何执行此操作 他们都建议我这样做 NSData data NSData
  • XAMPP无法安装xdebug

    你好 我已经安装了 xampp 将 php ini 更改为 XDebug zend extension C xampp php ext php xdebug 2 2 3 5 3 vc9 dll xdebug profiler append
  • 是否可以使用 Drupal api 获取用户列表?

    我想获取已分配特定角色的所有用户的列表 我可以编写自己的 SQL 但我想尽可能多地使用 api 您可以使用entity load来获取用户数组 这是将为管理员用户创建所有电子邮件列表的示例 用于发送通知
  • 如何使用 PHP 跳过 XML 文件中的无效字符

    我正在尝试使用 PHP 解析 XML 文件 但收到错误消息 解析器错误 字符 0x0 超出允许范围 我认为这是因为 XML 的内容 我认为有一个特殊符号 我能做些什么来修复它 我还得到 解析器错误 标签项行中数据过早结束 可能是什么原因导致
  • 扭曲的导航栏自定义后退按钮

    我有一个自定义后退按钮 该按钮没有按预期显示 它正在被拉伸 即使后退按钮文本为空 它仍然显示 后退 文本 提前致谢 我通常使用这种技术来使其发挥作用 要删除默认标题 UIBarButtonItem appearance setBackBut
  • AMQPRuntimeException:读取数据时出错。收到 0 而不是预期的 7 字节

    它曾经有效 但现在不再有效了 我正在使用 php amqplib 和 RabbitMQ 当我尝试创建新的 AMQP 连接时 connection new AMQPConnection localhost 5672 username pass
  • 将 PHP 错误处理程序限制为特定命名空间

    PHP 有没有办法只为特定的命名空间设置错误处理程序 我正在构建一个小型框架 我希望能够通过设置自定义错误处理程序并抛出异常来尝试捕获其名称空间内的所有错误 警告 通知消息 在此特定名称空间之外触发的错误应该以常规方式表现 用PHP可以完成
  • json_encode() 非 utf-8 字符串?

    所以我有一个字符串数组 并且所有字符串都使用系统默认值ANSI编码并从 SQL 数据库中提取 因此有 256 种不同的可能的字符字节值 单字节编码 有什么方法可以让我得到json encode 工作并显示这些字符而不必使用utf8 enco
  • 如何判断一个具有很多属性的对象(自身)是否发生了改变?

    问题的简短版本 我有一个带有大量声明属性的类 我想跟踪它是否有任何更改 以便当我调用save方法 当不需要时它不会写入数据库 我如何更新isDirty财产无需为所有声明的属性编写自定义设置器 问题的较长版本 假设我有一堂这样的课 inter
  • 当查询没有返回记录时,如何通过 PDO/Sqlite 获取列名?

    下面的代码允许我将 SQL 语句传递给一个类并调用其方法来显示一个漂亮的结果表 包括列名 然而 如果没有结果 我仍然想要列名要显示 很遗憾 getColumnMeta没有像我发现的其他示例中那样返回任何数据 有谁知道如何让 getColum
  • 使用 PHP DOM 获取子节点的值

    下面是我使用的 XML 示例

随机推荐

  • Android 实现具有 hashmap 的 Parcelable 对象

    我有这样的课程 public class RateData Map
  • 无法从非 EcmaScript 模块导入命名导出“指令”(仅提供默认导出)

    这是我正在开发的一个离子角度项目 我正在使用 ng lazyload image 插件Link https www npmjs com package ng lazyload image 当我开始编译它时显示这样的错误 Error node
  • 使用 phpunit 9.5 捕获警告、通知和弃用

    Quoting https phpunit readthedocs io en 9 5 writing tests for phpunit html testing php errors warnings and notices https
  • 为什么分析使用 1x1 像素?

    导致插件分析使用 1x1 img 像素调用其代码的原因是什么 这个快捷方式有什么权限 托管 1x1px 图像的服务器记录该请求 这允许收集有关谁加载 和呈现 带有图像的页面的统计信息 浏览器通常允许 img 标签中的跨源 此外 这还允许从与
  • Scala:抽象类型模式 A 未被选中,因为它已被擦除消除

    我正在编写只能捕获特定类型异常的函数 def myFunc A lt Exception try println Hello world or something else catch case a A gt warning abstrac
  • 如何在 Windows 7 上安装 ROracle 软件包?

    我正在尝试在 Windows 7 客户端上安装 ROracle 包 我安装了 Oracle Instant 客户端和 Rtools 安装了 DBI 包 设置了 OCI32 LIB 环境变量 但是当我尝试从命令行安装时 C Temp gt R
  • 按组手动填充多个比例的geom_tile

    I have the following current output 我的目标是像这样的着色 但只填充到最大级别 例如填充停止在当前级别 创建此数据的数据是 df lt tribble Question Code RespondentLe
  • 如何让react中所有可折叠项默认打开?

    我使用reactstrap制作了一个带有令牌的可折叠按钮 并且按钮单击折叠一切正常 我希望保持这种情况 但另一方面 我如何修改它以使所有可折叠按钮在页面初始渲染时打开 访问页面时 所有令牌都需要可见 这意味着所有可折叠项目都需要打开 如果我
  • java 8后具有多个选择的联合查询

    这是我想在 MySQL 中尝试的一个查询 SELECT A x FROM A WHERE A y P UNION SELECT A x FROM A WHERE A y Q 上面是我正在尝试的原始查询的精简版 简单得多的版本 在我原来的查询
  • 从 Android 中的纬度和经度获取城市名称提供的服务不可用 Android 4.0.3?

    我在应用程序中使用的是Android 4 0 3版本 现在我想获取城市名称或其他信息LATITUDE and 经度但当我运行应用程序时 显示服务不可用 Logcat 01 10 13 58 29 279 W System err 1211
  • Twitter Bootstrap Collapse 插件方向 - 水平而不是垂直

    有没有办法从水平方向而不是垂直方向折叠 Bootstrap Collapse 插件 看看代码 这种能力似乎没有内置 但我希望我只是错过了一些东西 任何帮助将不胜感激 谢谢 我想出了如何在不修改或添加任何 JavaScript 的情况下非常轻
  • 自定义 jquery 验证和不显眼的 JavaScript

    我正在尝试编写一个自定义验证 如果在提交表单时文本区域中存在 html 则会给出错误 我有以下内容 它不起作用 我不知道为什么 我也不明白不引人注目的部分 有人可以告诉我如何做到这一点 因为我看到其他有它的例子 文本区域有一个类 note
  • 使用 Polyfit 进行垂直线拟合

    这只是一个基本问题 我正在使用拟合线来分散点polyfit 在某些情况下 我的散点具有相同的 X 值并且polyfit无法在其上放置一条线 必须有某种东西可以处理这种情况 毕竟 它只是一个线配合 我可以尝试交换 X 和 Y 然后再画一条线
  • 在 Perl eval 中捕获变量赋值

    我希望能够从 Perl eval 捕获变量赋值 也就是说 确定代码中分配给哪些变量名称并提取它们的值 例如 如果我运行 eval foo 42 bar 3 14 eval 的结果是 3 14 最后评估的值 但我还希望能够确定名称 foo 和
  • 使用 htmlAttributes 正确制作 ActionLink 扩展

    我为我的 ActionLink 使用自定义扩展 我添加了一个属性data url这意味着被翻译成一个属性data url 即用破折号替换下划线 这是使用我的自定义扩展的链接 1 Ajax ActionLink Add MyRoutes Ge
  • 带变量的 ansible regex_search

    如何在ansible playbook中使用正则表达式查找匹配项 其中变量出现在regex search争论 以下剧本在使用以下命令运行时找不到匹配项 ansible playbook playbook yml hosts localhos
  • 程序崩溃后取消警报

    我有一个后台服务 它设置重复警报 执行其任务并自行停止 然后 当闹钟唤醒时 它会再次启动服务 如果程序崩溃 警报仍然存在并唤醒警报广播接收器 有什么方法可以取消崩溃时的警报 我想我也许可以取消任何捕获的异常的警报 但其他原因呢 或者当警报广
  • 新 Maven/Spring MVC 项目的最小 pom.xml 文件

    我对 Maven 和 Spring MVC 完全陌生 我想做的是使用 Maven 设置一个新的 Spring MVC 项目 希望这句话有意义 并使用 Eclipse 在 Tomcat 上运行我的 Web 应用程序 我正在按照此链接上的教程进
  • 为什么 Logstash 需要这么长时间才能启动/加载?

    Edit 我更改了标题 因为问题不是我最初想象的那样 事实是 logstash 需要超过一分钟开始 这可能会被误解为 沉默 我正在尝试让logstash运行 所以我按照官方网站上的说明进行独立安装 http logstash net doc
  • 为什么 NSURLSession uploadTaskWithRequest:fromData: 无法上传到 php 服务器?

    php 代码工作正常 我已经从同一服务器上的 html 表单上传了文件 上传的文件大小从 40K 到 2 0M 不等 因此其大小不高 在运行 PHP 5 3 的服务器上激活文件上传 我发现了很多这样的帖子 还没有答案 https stack