【问题标题】:Titanium - Send picture to server : file size bugTitanium - 将图片发送到服务器:文件大小错误
【发布时间】:2017-06-11 13:19:01
【问题描述】:

我想将图片从我的应用(iOS 和 Android)发送到我的服务器。我的代码适用于小图片,但如果尺寸太大,当我发送数据时,什么也没有发生,应用程序变慢。 你能解释一下我的代码中的问题以及如何解决它吗?非常感谢:)

这是我的代码:

var attached_media = [];
var file_btn = Ti.UI.createButton({ title: L('select') });

file_btn.addEventListener('click',function(e){
    Titanium.Media.showCamera({
        success:function(e) {
            if(e.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) {
                attached_media.push(Ti.Utils.base64encode(e.media).text);
            }
        },
        saveToPhotoGallery:true,
        allowEditing: false,
        mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO]
    });
});

var send_button = Titanium.UI.createButton({
   title: 'Send',
});

send_button.addEventListener('click',function(e){

    var req = ......
    req.send({ 'medias':JSON.stringify(attached_media), 'user_id':Ti.App.Properties.getInt('user_id')});

});

我删除了不必要的代码,因为它太长了! :)

【问题讨论】:

  • 必须发送base64文件吗?可能请求大小超过了最大长度。 req 变量会很有趣,因为您没有显示任何有关设置的信息
  • 您是否在后端使用 .NET Web API。我有类似的问题。
  • 我没有设法上传我的文件,除非使用 base64 编码。在我的帖子字段中,我发送:'medias':JSON.stringify(attached_media)。我的后端是 PHP。但是 Image Factory 解决方案有效,所以我想我会保留它 :)

标签: android ios titanium appcelerator media


【解决方案1】:

我从所提供的信息中了解到,您在上传大尺寸照片时遇到问题,比如来自相机的照片超过 2-3MB。

目前我可以建议您的唯一解决方案是使用此 iOS-Android 模块 Ti-ImageFactory 压缩图像,然后再保存或发送到服务器。

我建议在相机的成功回调中捕获图像后立即压缩图像,如下所示:

file_btn.addEventListener('click',function(e){
    Titanium.Media.showCamera({
        success:function(e) {
            if(e.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) {
                Ti.API.info("Initial pic bytes = " + e.media.length);

                // if bytes length of pic is larger than 3MB or 3145728 bytes, set compression to 0.5,
                // else keep it to default which is 0.7
                var imf = require('ti.imagefactory');
                var compressedPic = (e.media.length > 3145728) ? imf.compress(0.5) : imf.compress();
                attached_media.push(Ti.Utils.base64encode(compressedPic).text);

                Ti.API.info("Compressed pic bytes = " + compressedPic.length);

                compressedPic = null;
            }
        },
        saveToPhotoGallery:true,
        allowEditing: false,
        mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO]
    });
});

添加代码 - 如果捕获的图片大小超过 3MB,则将其压缩 0.5 级别,否则使用默认级别 0.7 进行压缩。还检查初始图片大小和压缩图片大小,以根据应用要求更快地上传以匹配更好的结果。

您还可以在 compress() 方法中传递压缩级别。有关更多信息,请参阅文档。

【讨论】:

  • 再次感谢@Prashant,您的解决方案运行良好:)
  • 此解决方案目前有效,但请记住,即使在压缩图像之后,根据您的服务器接受程度,它也可能会很大。因此,还要查找服务器设置为什么它不允许更大的图像或在发送大图像时连接中断。最后但并非最不重要的一点是,您可以在回调中检查图片大小以通过不同的压缩级别来获取更大的图像。我在上面的答案中为不同的压缩级别添加了更多代码。
猜你喜欢
  • 2013-07-11
  • 2011-07-21
  • 2011-11-18
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多