5

smarty好的,所以在使用in测试文件上传时,我从 Internet Explorer 收到了这个奇怪的意外响应php

这里我的文件上传(view)的聪明代码,简化为主要问题,对于那些没有使用过activecollab的人来说,Router::assemble它只是形成一个带有从MVC读取的参数的url。

界面
(来源:iforce.co.nz

 <div id="xero_invoice_manager_api">
 {form action=Router::assemble('xero_invoice_manager_api') method=post id="xero_invoice_manager" enctype="multipart/form-data"}
 <div class="content_stack_wrapper">

 <input type="file" name="file_1" /><br/>
 <input type="file" name="file_2" /><br/>
 {wrap_buttons}
 {submit success_event="api_updated" }Authenticate{/submit}
 {/wrap_buttons}
 {/form}
 </div></div>

这是我的view.

 App.Wireframe.Events.bind('api_event_finished.content', function(event, settings) {
App.Wireframe.Flash.success(App.lang('Xero Invoice Manager has saved/uploaded your Xero API data.'));
 });

这是我的简化控制器(我发现问题出在 smarty 而不是 php)。

//api view
function api(){
    if ( $this->request->isSubmitted()) {
        $this->response->respondWithData(true);
    }
}

这是我的控制器与上传发生..

//api view
function api(){
    $this->assignSmarty();
    if ($this->request->isSubmitted()) {
        $this->XeroAuthUpdate(); //update everything
        if(isset($_FILES)){
            $file_manager = new XeroFileManager();
            $file_manager->dumpFiles($_FILES);
            //upload the files
            foreach($_FILES as $file){
                $file_manager->handle_certificate_file($file);
            } //foreach add the headers
            if(function_exists('headers_list')){
                xeroDebugMode("[Controller] the headers to be sent are... ", headers_list());
            } //function check
        } //end if
        $this->response->respondWithData(array(
           // constraints
           'key_result'           => (bool)$this->checkValue(XeroAuths::getSetting('xero_consumer')),
           'secret_result'        => (bool)$this->checkValue(XeroAuths::getSetting('xero_secret')),
           // files secruity certificates
           'publickey'            =>  (bool)file_exists(XERO_PUBLIC_KEY_PATH),
           'privatekey'           =>  (bool)file_exists(XERO_PRIVATE_KEY_PATH),
           'xero_auth'            =>  (bool)validateXeroAuth(),
           //login constraints
           'install'              => !$this->checkInstallRequirements(),
        ));
    } //close the request
}

这是来自 Firefox 的回复,file_1并且file_2不是空的。

火狐
(来源:iforce.co.nz

这是来自 Internet Explorer 9 的回复,带有file_1file_2 的(到目前为止一切都很好)。

即空
(来源:iforce.co.nz

这是来自 Internet Explorer 9的有问题file_1的响应,其中(即 publickey.cer)和file_2(即 privatekey.pem)不为空(下载 index.php 吧?)。

不是空的
(来源:iforce.co.nz

我对 activecollab 的回应

你好迈克尔,

这么晚才回复很抱歉。

不幸的是,我们无法弄清楚问题出在哪里。看起来一切都写得很好,但如果不处理代码本身,我们几乎无能为力。在 IE 中处理 JSON 响应在 activeCollab 中运行良好(嗯,不是在 IE6 中),因为 aC 3 中的几乎所有内容都基于 JSON,这使您的问题变得具体,并且您的代码中可能有问题。

问候, Oliver Maksimovic activeCollab 开发和支持

一般和售前问题:1-888-422-6260(免费电话) 技术支持:support@activecollab.com

一位同事建议..

建议尝试以下操作:1)打开 IE -> 打开开发工具(按 F12)-> 单击菜单中的“缓存”-> 单击“清除浏览器缓存”...完成后单击“缓存”,然后单击“总是从服务器刷新”。

这迫使 IE 不缓存任何东西,因为我有很多次 IE 缓存 ajax 请求并导致一些非常奇怪的行为。

如果这可以解决您的问题,请告诉我,如果可以,我们可以在您的 ajax 响应中添加一些 php,以强制所有浏览器从不缓存响应。否则,如果仍然不起作用,可能需要在 IE 中进行一些 JS 调试,以查看发送的内容并将其与您的 FF firebug 结果进行比较。

headers_sent()出现空白

但是headers_list(就在之前respondWithData被调用),用于 Internet Explorer。

2012-08-08 06:50:16 the headers sent from this request is... Array
(
    [0] => X-Powered-By: PHP/5.3.8
    [1] => Set-Cookie: ac_activeCollab_sid_yhRk0xSZku=1%2Fhkykz0Rw0796e4lDykXekNXvhMMxC8pV4akJPMvA%2F2012-08-08+06%3A50%3A15; expires=Wed, 22-Aug-2012 06:50:15 GMT; path=/
    [2] => Content-Type: application/json
    [3] => Expires: Mon, 26 Jul 1997 05:00:00 GMT
    [4] => Cache-Control: no-cache, no-store, must-revalidate
    [5] => Pragma: no-cache
)

Raw来自Fiddler 上的选项卡的响应标头,在 Internet Explorer 上

HTTP/1.1 200 OK
Date: Sat, 11 Aug 2012 08:08:46 GMT
Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie:   ac_activeCollab_sid_yhRk0xSZku=11%2Fz8rWxiRchAh8EWinYO2d7a1mmvn2DMKUdse1vfKh%2F2012-08-11+0    8%3A08%3A46; expires=Sat, 25-Aug-2012 08:08:46 GMT; path=/
Content-Length: 107
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

 {"key_result":true,"secret_result":true,"publickey":true,"privatekey":true,"xero_auth":true,"install":true}

Raw来自Firefox 选项卡的响应标头。

HTTP/1.1 200 OK
Date: Sat, 11 Aug 2012 08:13:45 GMT
Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: ac_activeCollab_sid_yhRk0xSZku=12%2FO40CbXC9Vfa7OVnderlK2MFnvnpkyeckvO0Ab5NQ%2F2012-08-11+08%3A13%3A45; expires=Sat, 25-Aug-2012 08:13:45 GMT; path=/
Content-Length: 107
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"key_result":true,"secret_result":true,"publickey":true,"privatekey":true,"xero_auth":true,"install":true}

关于我在 IE 上做错了什么的任何想法?以及为什么 Internet Explorer 通知用户下载index.php(当字段处于活动状态时)。请记住,服务器端没有实际上传(在初始测试期间,index.php 下载请求与 .php 无关move_uploaded_file)。

4

3 回答 3

0

我在使用 pupload 和 mvc3 时遇到了类似的问题。我知道我们使用不同的技术,但也许我的问题可以帮助你。我有这个:

 public JsonResult UploadDoc(string correlationId)
    {
        try
        {

           //upload code here
            return Json(new { message = "chunk uploaded", name = "test" });           

        }
        catch (Exception ex)
        {

            return Json(new { message = "chunk uploaded", name = "test" });  
        }

    }

现在,每次我想尝试上传文件时,我都会让 IE 要求我打开或下载一个只包含上面那个 json 响应的文件。如果我将返回类型设置为“字符串”并将返回代码设置为:

 return "{\"respCode\" : \"200\", \"Msg\" : \"succussful\",\"mimeType\": \"" +  Request.Files[0].ContentType + "\", \"fileSize\": \"" + Request.Files[0].ContentLength + "\"}";

然后文件就成功上传了。失败时的响应标头: "Content-Type: application/json; charset=utf-8" 。使用“String”返回类型时的响应标头:“Content-Type: text/html; charset=utf-8”。希望有帮助,加油。

于 2012-08-10T14:05:45.593 回答
0

由于缺乏答案,我认为我需要在我的 jquery 中采用不同的方法.. 直到找到实际的解决方案。

于 2012-08-04T12:21:40.723 回答
0

可能是 IE 特定代码有错误,因此返回的内容类型不同。如果您对某种 XML 或 JSON 数据发出 AJAX 请求,而是得到某种文件 HTML 错误响应,其内容类型或处置与预期不同,浏览器可能不知道如何处理它。

您可能想找到一种方法来查看或记录 Web 服务器发送的响应(而不是请求)标头。通常文件下载的提示来自内容处置头......虽然在这种情况下它可能只是因为它是来自异步请求的文件。

您可能还想看看:

IE 提示从服务器打开或保存 json 结果如何说服 IE 简单地显示 application/json 而不是提供下载?

于 2012-08-08T02:15:24.367 回答