Swift - 从相册中选择照片并上传(使用UIImagePickerController)

Swift - 从相册中选择照片并上传(使用UIImagePickerController)

选择本地图片并上传是应用开发中一个比较常见的功能。
    原文:Swift - 从相册中选择照片并上传(使用UIImagePickerController)    原文:Swift - 从相册中选择照片并上传(使用UIImagePickerController)
我们使用  UIImagePickerController 可以很方便的从系统“照片”中选择图片,但我们会发现选择完毕后,通过图片的  info[UIImagePickerControllerReferenceURL] 得到的是一个引用路径,格式如下:
1
assets-library: //asset/asset.PNG?id=90B54369-5E79-433D-B74A-E8E0870EAF27&ext=PNG
用这个路径是没法上传文件的。想要把选择的图片上传,通常我们会想到如下两种方式:


方法一:先将图片保存到一个临时文件夹下,再上传
下面样例在  imagePickerController 选择图片后,使用  fileManager 将其复制保存到应用的文档目录下,再将复制过来的图片上传。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import  UIKit
import  Alamofire
 
class  ViewController UIViewController UIImagePickerControllerDelegate ,
UINavigationControllerDelegate  {
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
     }
     
     //选取相册
     @IBAction  func  fromAlbum(sender:  AnyObject ) {
         //判断设置是否支持图片库
         if  UIImagePickerController .isSourceTypeAvailable(. PhotoLibrary ){
             //初始化图片控制器
             let  picker =  UIImagePickerController ()
             //设置代理
             picker.delegate =  self
             //指定图片控制器类型
             picker.sourceType =  UIImagePickerControllerSourceType . PhotoLibrary
             //弹出控制器,显示界面
             self .presentViewController(picker, animated:  true , completion: {
                 () ->  Void  in
             })
         } else {
             print ( "读取相册错误" )
         }
         
     }
     
     //选择图片成功后代理
     func  imagePickerController(picker:  UIImagePickerController ,
                                didFinishPickingMediaWithInfo info: [ String  AnyObject ]) {
         //获取选择的原图
         let  pickedImage = info[ UIImagePickerControllerOriginalImage as UIImage
        
         //将选择的图片保存到Document目录下
         let  fileManager =  NSFileManager .defaultManager()
         let  rootPath =  NSSearchPathForDirectoriesInDomains (. DocumentDirectory ,
                                                            . UserDomainMask true )[0]  as  String
         let  filePath =  "\(rootPath)/pickedimage.jpg"
         let  imageData =  UIImageJPEGRepresentation (pickedImage, 1.0)
         fileManager.createFileAtPath(filePath, contents: imageData, attributes:  nil )
         
         //上传图片
         if  (fileManager.fileExistsAtPath(filePath)){
             //取得NSURL
             let  imageNSURL: NSURL  NSURL . init (fileURLWithPath: filePath)
             
             //使用Alamofire上传
             Alamofire .upload(. POST "http://www.hangge.com/upload.php" , file: imageNSURL)
                 .responseString { response  in
                 print ( "Success: \(response.result.isSuccess)" )
                 print ( "Response String: \(response.result.value)" )
             }
         }
        
         //图片控制器退出
         picker.dismissViewControllerAnimated( true , completion: nil )
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}
不管使用模拟器还是真机调试,运行后可以看到图片上传成功了:
原文:Swift - 从相册中选择照片并上传(使用UIImagePickerController)


方法二:使用PhotoKit获取选择图片的真实路径,再上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
在这里留下你想说的话。 import  UIKit
import  Alamofire
import  Photos
 
class  ViewController UIViewController UIImagePickerControllerDelegate ,
UINavigationControllerDelegate  {
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
     }
     
     //选取相册
     @IBAction  func  fromAlbum(sender:  AnyObject ) {
         //判断设置是否支持图片库
         if  UIImagePickerController .isSourceTypeAvailable(. PhotoLibrary ){
             //初始化图片控制器
             let  picker =  UIImagePickerController ()
             //设置代理
             picker.delegate =  self
             //指定图片控制器类型
             picker.sourceType =  UIImagePickerControllerSourceType . PhotoLibrary
             //弹出控制器,显示界面
             self .presentViewController(picker, animated:  true , completion: {
                 () ->  Void  in
             })
         } else {
             print ( "读取相册错误" )
         }
         
     }
     
     //选择图片成功后代理
     func  imagePickerController(picker:  UIImagePickerController ,
                                didFinishPickingMediaWithInfo info: [ String  AnyObject ]) {
         //选择图片的引用路径
         let  pickedURL: NSURL  = info[ UIImagePickerControllerReferenceURL as NSURL
         let  fetchResult:  PHFetchResult  PHAsset .fetchAssetsWithALAssetURLs([pickedURL],
                                                                             options:  nil )
         let  asset:  PHAsset  = fetchResult.firstObject  as PHAsset
         
         PHImageManager .defaultManager()
             .requestImageDataForAsset(asset, options:  nil , resultHandler: {
             (imageData:  NSData ?, dataUTI:  String ?, orientation:  UIImageOrientation ,
             info: [ NSObject  AnyObject ]?)  in
             //获取实际路径
             let  imageNSURL:  NSURL  = info![ "PHImageFileURLKey" as NSURL
             print ( "路径:" ,imageNSURL)
             print ( "文件名:" ,imageNSURL.lastPathComponent)
             
             //使用Alamofire上传
             Alamofire .upload(. POST "http://www.hangge.com/upload.php" , file: imageNSURL)
                 .responseString { response  in
                 print ( "Success: \(response.result.isSuccess)" )
                 print ( "Response String: \(response.result.value)" )
             }
         })
  
         //图片控制器退出
         picker.dismissViewControllerAnimated( true , completion: nil )
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}
使用模拟器运行后,可以看到图片上传成功了:
原文:Swift - 从相册中选择照片并上传(使用UIImagePickerController)

但如果使用真机调试的话,虽然我们得到了图片的真实路径和文件名,但还是无法上传。 所以上传图片还是建议使用方法一。
原文:Swift - 从相册中选择照片并上传(使用UIImagePickerController)



附录:
(1)本文样例使用  Alamofire 上传文件,对于Alamofire不熟悉的可参考我原来写过的几篇文章:
Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)
Swift - HTTP网络操作库Alamofire使用详解2(文件上传)
(2)服务端php代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php 
/** php 接收流文件
* @param  String  $file 接收后保存的文件名
* @return boolean
*/
function  receiveStreamFile( $receiveFile ){   
     $streamData  = isset( $GLOBALS [ 'HTTP_RAW_POST_DATA' ])?  $GLOBALS [ 'HTTP_RAW_POST_DATA' ] :  ''
    
     if ( empty ( $streamData )){ 
         $streamData  file_get_contents ( 'php://input' ); 
    
    
     if ( $streamData != '' ){ 
         $ret  file_put_contents ( $receiveFile $streamData , true); 
     } else
         $ret  = false; 
    
   
     return  $ret ;   
  
//定义服务器存储路径和文件名
$receiveFile  =   $_SERVER [ "DOCUMENT_ROOT" ]. "/uploadFiles/hangge.zip"
$ret  = receiveStreamFile( $receiveFile ); 
echo  json_encode( array ( 'success' =>(bool) $ret )); 
?>

原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1174.html
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值