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 无法上传文件的主要内容,如果未能解决你的问题,请参考以下文章
Apache HttpClient 4.0 无法在 Android 上的套接字超时
如何使用 C# HttpClient PostAsync 显示上传进度