swift -从相册中选择照片并上传

选择本地图片并上传是应用开发中一个比较常见的功能。

   

原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_1174.html

我们使用 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 ViewControllerUIViewControllerUIImagePickerControllerDelegate,

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[UIImagePickerControllerOriginalImageasUIImage

       

        //将选择的图片保存到Document目录下

        let fileManager = NSFileManager.defaultManager()

        let rootPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,

                                                           .UserDomainMasktrue)[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()

    }

}

不管使用模拟器还是真机调试,运行后可以看到图片上传成功了:

方法二:使用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 ViewControllerUIViewControllerUIImagePickerControllerDelegate,

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[UIImagePickerControllerReferenceURLasNSURL

        let fetchResult: PHFetchResult PHAsset.fetchAssetsWithALAssetURLs([pickedURL],

                                                                            options: nil)

        let asset: PHAsset = fetchResult.firstObject asPHAsset

        

        PHImageManager.defaultManager()

            .requestImageDataForAsset(asset, options: nil, resultHandler: {

            (imageData: NSData?, dataUTI: String?, orientation: UIImageOrientation,

            info: [NSObject AnyObject]?) in

            //获取实际路径

            let imageNSURL: NSURL = info!["PHImageFileURLKey"asNSURL

            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()

    }

}

使用模拟器运行后,可以看到图片上传成功了:

但如果使用真机调试的话,虽然我们得到了图片的真实路径和文件名,但还是无法上传。所以上传图片还是建议使用方法一。

附录:

(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

时间: 2024-10-12 23:50:39

swift -从相册中选择照片并上传的相关文章

从系统相册中选择GIF图片上传到服务器

-(void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)assets { for (int i = 0; i < assets.count; i ++) { ALAsset *asset = assets[i]; ALAssetRepresentation *rep = [asset defaultRepresentation]; if ([rep.UTI

Swift - 从相册中选择视频(过滤掉照片,使用UIImagePickerController)

(本文代码已升级至Swift4) 有时我们需要从系统相册中选择视频录像,来进行编辑或者上传操作,这时使用 UIImagePickerController 就可以实现. 默认情况下,UIImagePickerController 打开系统"照片"后允许用户选择所有的媒体文件(不管是照片还是录像),我们可以通过 mediaTypes 属性设置.让其只显示视频录像. 1,样例说明 (1)下面样例点击"选择视频"按钮后,会自动打开相册选择视频. (2)由于设置了 media

Android-对相册中的图片进行上传或下载

目标效果:     打开相册选择一张图片,会显示到上方的ImageView中并存储到Bmob中,存储后进入Bmob后台,复制刚才添加的数据的objectId,粘贴到代码指定出,然后运行,点击下载会在下方的ImageView显示刚才上传的图片,这里的下载是指定objectId,可以进行动态获取objectId进行下载. 1.activity_main.xml页面设置布局. activity_main.xml页面: <RelativeLayout xmlns:android="http://s

关于解决 从相册中选择照片后无法剪切图片以及无法加载图片的问题

程序分析: 主要分两个部分 (1)先拍照,然后剪切,最后显示出来.    (2)从相册中选择一张照片进行剪切然后显示出来 代码参照<第一行代码>,书中的代码运行时(2)出现了问题,无法剪切图片且无法加载图片 MainActivity.java代码如下: 1 package com.example.lynn.choosepictest; 2 3 import android.content.Intent; 4 import android.graphics.Bitmap; 5 import an

android 从相册中选择图片并判断图片是否旋转

今天在做图片合成时,首先从相册中选择图片,然后判断该图片是否旋转了,今天就讲下图片是否旋转,直接上代码 /** * 读取照片exif信息中的旋转角度 * * @param path * 照片路径 * @return角度 获取从相册中选中图片的角度 */ public static int readPictureDegree(String path) { if (TextUtils.isEmpty(path)) { return 0; } int degree = 0; try { ExifInt

jsp实现仿QQ空间新建多个相册名称,向相册中添加照片

工具:Eclipse,Oracle,smartupload.jar:语言:jsp,Java:数据存储:Oracle. 实现功能介绍: 主要是新建相册,可以建多个相册,在相册中添加多张照片,删除照片,删除相册,当相册下有照片时先删除照片才能删除相册. 因为每个相册和照片要有所属人,所以顺带有登录功能. 声明:只是后端实现代码,前台无任何样式,代码测试可行,仅供参考. 代码: 数据库连接帮助类: public class JDBCHelper { public static final String

MUI 单个图片上传预览(拍照+系统相册):先选择-&gt;预览-&gt;上传提交

1 html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link href="../css/mui.min.css" rel="stylesheet" /> <script src="../js/mui.min.js"></s

从相册中选择图片进行压缩并用ImageView展示出来

从手机中选择照片这是几乎所有应用的功能之一,主要考虑到一点的就是如果图片太大了,可能会OOM,简单的处理就是对图片进行压缩! <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" and

获取某一个相册中所有照片和照片的缩略图

- (void)loadAssets { // Initialise _assets = [NSMutableArray new]; _assetLibrary = [[ALAssetsLibrary alloc] init]; // Run in the background as it takes a while to get all assets from the library dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE