Titanium HTTPCLIENT 无法上传文件

Posted

技术标签:

【中文标题】Titanium HTTPCLIENT 无法上传文件【英文标题】:Titanium HTTPCLIENT can't upload file 【发布时间】:2013-12-16 03:27:05 【问题描述】:

我尝试使用Brower可以上传文件,但是如果我使用Titanium上传,它不起作用, 浏览器代码是 浏览器上传文件:

<form action="upload.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>

上传.php文件:

$tmp_file=$_FILES['file']['tmp_name'];
$target_file=basename($_FILES['file']['name']);
move_uploaded_file($tmp_file, "files/".$target_file);

我的钛代码是:

var webaddress = 'http://' + address.value + ':' + port1.value + '/scanbatch/index.php';
xhr.open('POST',webaddress);
xhr.send(files : Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'scanbatch.txt'));

它可以工作,但网络服务没有收到任何东西,只是收到了一个标头。

顺便说一句,我可以通过httpclient发送短xml,但是如果xml较长有时无法发送,越长越失败,我的意思是不一定,如果xml超过512KB,它总是失败。

我的代码是

var webaddress = 'http://' + address.value + ':' + port1.value + '/liveho/scanbatch';   
xhr.open('POST',webaddress);
xhr.send(xmlscript);

我的onload函数是

onload : function(e)   
            alert(this.responseText);   
        ,

请帮帮我,谢谢

【问题讨论】:

【参考方案1】:

我会给你一些建议,以缩小问题范围(钛方面)。

你测试过文件路径是否正确吗?

var file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory + 
    Ti.Filesystem.getSeparator() + 'scanbatch.txt');

if(file.size)
    xhr.send(files : file);
else
    Ti.API.info("File " + file.nativePath + " doesn't exist or is empty");

如果路径不正确,尝试在resourcesDirectory中查找:

var file = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory + 
    Ti.Filesystem.getSeparator() + 'scanbatch.txt');

您的断开连接问题可能会减少设置超时属性。 onerror 函数也可以帮助您找到问题所在。 onsendstream 属性会让您知道上传的进度。

Ti.Network.createHTTPClient(
...
    onload : function(e)   
        alert(this.responseText);   
    ,
    onerror : function(e)   
        Ti.API.debug(e.error);
        alert(e.error);  
    ,
    onsendstream : function(e)   
        var progress = parseFloat(e.progress)*100;
        Ti.API.info("Upload progress:" + progress + "%");
        //e.progress will contain a value from 0.0-1.0 with the progress of the upload
        alert("Upload progress:" + progress + "%"); 
    ,
    timeout : 5000  // in milliseconds
...
);

【讨论】:

谢谢,但是路径是正确的,我的超时属性是35000 并且网络服务总是在很短的时间内反馈给我。错误只是取决于我的文件大小,我不知道为什么 在这种情况下,这种情况下:xhr.send(xmlscript); 或其他情况下:xhr.send(files : file); ? onload功能是一样的,只是按钮不同,一个发送文件,一个发送xml,timemout属性是一样的,在xml的情况下我可以发送小尺寸的信息。如果尺寸变大,它不能。文件案例的问题是我可以将小文件发送到c#编写的webservice,但是如果文件大小变大,它就无法接收。所以我用apache写了一个webservice,代码在upfile。它不能发送任何东西到那里,只是标题 要更改内容类型,您必须在调用 xhr.send 之前更改请求标头,这样:xhr.setRequestHeader("Content-Type", "multipart/form-data"); 您能否确认将内容类型更改为 multipart/form-data 是否适用于 xml大于 512kb?

以上是关于Titanium HTTPCLIENT 无法上传文件的主要内容,如果未能解决你的问题,请参考以下文章

Titanium 地理定位跟踪无法正常工作

Titanium mobileweb 字体无法正常工作

Apache HttpClient 4.0 无法在 Android 上的套接字超时

如何使用 C# HttpClient PostAsync 显示上传进度

在 Titanium Android 中关闭移动数据时,一次拍摄 getCurrentLocation 无法获取新位置

Angular HttpClient 无法代理