titanium 图片上传(多图上传)

发表于:,更新于:,By Sally
大纲
  1. 1. android 和 ios 实现多图片上传
    1. 1.1. 首先,要能够多选图片,使用这个 TiMediaPicker
    2. 1.2. 接着,在ios端,直接就可以得到图片的Blob信息,进行上传,一切ok
    3. 1.3. 而在android端,得到的却是图片的路径(有缩略图路径,也有原始图片的路径),缩略图用来进行预览,原始图片进行上传。这里有一个大坑。。。

android 和 ios 实现多图片上传

首先,要能够多选图片,使用这个 TiMediaPicker

  • 具体的操作,参考里面的example

接着,在ios端,直接就可以得到图片的Blob信息,进行上传,一切ok

而在android端,得到的却是图片的路径(有缩略图路径,也有原始图片的路径),缩略图用来进行预览,原始图片进行上传。这里有一个大坑。。。

  • 因为在android端,只能获得图片的路径,所以就需要通过

Ti.Filesystem.getFile('file://'+item.url).read() 来获得图片的对象吧(也许描述不准确,但是可以上传就是了)

  • 然后理所当然的通过post传递参数,进行上传,但是。。。
1
Parameters: {"content\r\nContent-Type: "=>"908908", "decorating_case_stage_id\r\nContent-Type: "=>"2", "file2"=>#<ActionDispatch::Http::UploadedFile:0x007f857a1cc760 @tempfile=#<Tempfile:/var/folders/1m/fz3bl8md2_d__gjwwgs_0fd80000gn/T/RackMultipart20151210-82452-123y7l7>, @original_filename="tixhr-46658484.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file2\"; filename=\"tixhr-46658484.jpeg\"\r\nContent-Type: image/jpeg\r\nContent-Transfer-Encoding: binary\r\n">, "current_day\r\nContent-Type: "=>"2015-12-10", "images_count\r\nContent-Type: "=>"2", "decoratingcase_id\r\nContent-Type: "=>"11", "file1"=>#<ActionDispatch::Http::UploadedFile:0x007f857a1cc350 @tempfile=#<Tempfile:/var/folders/1m/fz3bl8md2_d__gjwwgs_0fd80000gn/T/RackMultipart20151210-82452-1d01zys>, @original_filename="tixhr722178397.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file1\"; filename=\"tixhr722178397.jpeg\"\r\nContent-Type: image/jpeg\r\nContent-Transfer-Encoding: binary\r\n">}
  • 如上所示,android端传递的参数,莫名其妙的都给每个key值添加了一个\r\nContent-Type : 这样的鬼东西,而ios就比较正常,效果如下所示
1
Parameters: {"content"=>"asdfasdf", "file2"=>"file:///storage/emulated/0/DCIM/.thumbnails/1448853745499.jpg", "decorating_case_stage_id"=>"2", "images_count"=>"2", "current_day"=>"2015-12-10", "file1"=>"file:///storage/emulated/0/DCIM/.thumbnails/1448276319474.jpg", "decoratingcase_id"=>"11"}
  • 那问题出现了,解决问题的办法呢,就是手动的替换参数的key值

  • 这里仍需注意一个问题:params是一个大hash,hash在遍历的过程中不可以修改自身,所以此处需要一个clone方法

1
2
3
4
5
6
7
8
9
# 对每个key都进行处理,去掉其中没用的部分,例如:"content\r\nContent-Type: "=>"1212"
params.clone.each_key{ |origin_key|
key_content_by_ti_bug = "\r\nContent-Type: "
if origin_key.include? key_content_by_ti_bug
new_key = origin_key.sub key_content_by_ti_bug, ""
params[new_key] = params[origin_key]
params.delete origin_key
end
}