上传图片(jpeg, png各种类型), 及视频

简介: <p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 这段时间需要整理一些东西, 先备注在这里, 将花时间把这个点整理一下。</p> <p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; lin

这段时间需要整理一些东西, 先备注在这里, 将花时间把这个点整理一下。

使用AFNetworking上传图片,(可一次上传多张图片,包含不同类型png, jpeg)

使用AFNetworking上传视频


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    AFHTTPRequestOperation *operation = [manager POST:mutPath

                                           parameters:param

                            constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

                                

                                if (mediaDatas.count > 0) {

                                    NSObject *firstObj = [mediaDatas objectAtIndexSafe:0];

                                    if ([firstObj isKindOfClass:[UIImage class]]) {     // 图片

                                        for(NSInteger i=0; i<mediaDatas.count; i++) {

                                            UIImage *eachImg = [mediaDatas objectAtIndexSafe:i];

                                            //NSData *eachImgData = UIImagePNGRepresentation(eachImg);

                                            NSData *eachImgData = UIImageJPEGRepresentation(eachImg, 0.5);

                                            [formData appendPartWithFileData:eachImgData name:[NSString stringWithFormat:@"img%d", i+1] fileName:[NSString stringWithFormat:@"img%d.jpg", i+1] mimeType:@"image/jpeg"];

                                        }

                                    }else {         // 视频

                                        ALAsset *asset = [mediaDatas objectAtIndexSafe:0];

                                        NBLog(@"asset=%@, representation=%@, url=%@", asset, [asset defaultRepresentation], [asset defaultRepresentation].url);

                                        if (asset != nil) {

                                                NSString *videoPath = [NSDocumentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.mov", 0]];    // 这里直接强制写一个即可,之前计划是用i++来区分不明视频

                                                NSURL *url = [NSURL fileURLWithPath:videoPath];

                                                NSError *theErro = nil;

                                                BOOL exportResult = [asset exportDataToURL:url error:&theErro];

                                                NBLog(@"exportResult=%@", exportResult?@"YES":@"NO");

                                                

                                            NSData *videoData = [NSData dataWithContentsOfURL:url];

                                                [formData appendPartWithFileData:videoData name:@"video1" fileName:@"video1.mov" mimeType:@"video/quicktime"];

                                            NBLog(@"method 2");

                                        }

                                    }

                                }

                            } success:^(AFHTTPRequestOperation *operation, idresponseObject) {

                                NSDictionary *returnedDic = [XXBaseViewController parseResponseObj:responseObject];


                                NBLog(@"post Big success returnedDic=%@", returnedDic);

                            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

                                NBLog(@"post big file fail error=%@", error);

                                if (errorBlock) {

                                    errorBlock(@{@"errorcode":@(error.code),@"errordomain":error.domain});

                                }

                            }];

    

    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long longtotalBytesWritten, long long totalBytesExpectedToWrite) {

        NSLog(@"bytesWritten=%d, totalBytesWritten=%lld, totalBytesExpectedToWrite=%lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);

        if (xxProgressView != nil) {

            [xxProgressView setProgressViewTo:totalBytesWritten*1.0/totalBytesExpectedToWrite];

        }

    }];


1. 注意上面上传图片时时, 需要先转为NSData, 然后再执行

[formData appendPartWithFileData:eachImgData name:[NSString stringWithFormat:@"img%d", i+1] fileName:[NSString stringWithFormat:@"img%d.jpg", i+1] mimeType:@"image/jpeg"];

执行这个方法时, name:部分是服务器用来解析的字段, 而fileName则是直接上传上去的图片, 注意一定要加 .jpg或者.png,(这个根据你得到这个imgData是通过jepg还是png的方式来获取决定)。 然后mimeType值也要与上面的类型对应, 网上看到有的说直接写成 @"image/*", 据说也是可以的, 没验证过。 
但一定要注意的是这个fileName中.jpg和.png是一定要添加的。 否则服务器可能会推断这个图片的类型, 推断时就可能推断错误, 而使得图片上传上去后,显示不出来的问题。 我在做这个项目时就遇到了这样的问题, 现象就是有时上传成功,有时上传失败。 有时上传上去3张图,结果只显示2张图, 最后一张图显示不出来的, 可能就是因为服务器推断格式时推断错误。

2. 对于上面的视频文件, 这里使用的是ALAsset类型, 这个是通过

CTAssetsPickerController来选择手机相册中的视频文件的。

然后通过生成一个视频文件名及地址, 并通过一个写方法, 写到该路径下, 写文件如下。

- (BOOL) exportDataToURL: (NSURL*) fileURL error: (NSError**) error

{

    [[NSFileManager defaultManager] createFileAtPath:[fileURL path] contents:nilattributes:nil];

    NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:fileURL error:error];

    if (!handle) {

        return NO;

    }

    

    ALAssetRepresentation *rep = [self defaultRepresentation];

    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));

    NSUInteger offset = 0, bytesRead = 0;

    

    do {

        @try {

            bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:error];

            [handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];

            offset += bytesRead;

        } @catch (NSException *exception) {

            free(buffer);

            return NO;

        }

    } while (bytesRead > 0);

    

    free(buffer);

    return YES;

}


把视频写入后,再通过NSData来取出这个视频的数据。 并添加到这个AFHttpRequestOperation的Body中, 进行传输。

(估计这里可能有更好的办法来实现这个功能, 因为上面这个写入文件后,再转成NSData感觉有些繁琐,因为我曾尝试过其它方法,如通过ALAsset来获取到这个视频文件的url地址, 然后再通过NSData直接取这个地址,结果发现上传给后台后, 后台并不能识别到这个视频文件,后台能知道确实收到了视频数据,但可能某些原因,使得前端再次去获取该视频文件时,发现播放不了。具体原因可以再次去进行研究。

尝试过程如下:

A:

上传后, 后台仅获取到文本

                                                ALAssetRepresentation *rep = [asset defaultRepresentation];

                                                Byte *buffer = (Byte*)malloc(rep.size);

                                                NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];

                                                NSData *videoData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

                                                //                                        [formData appendPartWithFormData:videoData name:@"video1"];

                                                [formData appendPartWithFileData:videoData name:@"video1" fileName:@"video1.mov" mimeType:@"video/quicktime"];

尝试B:

通过NSURl来取到这个地址, 然后用NSData来取视频, 然后再把这个视频进行上传。

有兴趣的朋友可以继续研究下去。 

注:上传视频时和上面的上传图片一样,需要指定这个.mov, 及video/quicktime 类型指定。 前面的方法中要进行存储到本地时, 文件名指定为%d.mov。

目录
相关文章
We were unable to authorize you in GitHub. Sorry for inconvenience, please try again later. IDEA2022
文章目录 彻底 解决 IDEA 2021 登录 GitHub 登录失败问题 一. 出现这种问题的原因: 二 . 先来看看正常情况下登录: 错误信息 三. 解决方案: 1.取消登录 2.点击加号,选择第二个登录方式 3.核心步骤 4.添加IDEA 授权的tokens 5.生成tokens 6.复制令牌授权码 7.回到IDEA 粘贴授权码 8.登陆成功 9.注意事项
3801 0
We were unable to authorize you in GitHub. Sorry for inconvenience, please try again later. IDEA2022
|
8月前
|
存储 人工智能 算法
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
阿里云向量检索服务Milvus 2.5版本在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在RAG 应用的 Retrieve 阶段的最佳实践。
1619 1
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
12月前
|
监控 API 数据安全/隐私保护
小红书详情API接口的获取与应用
在互联网信息爆炸的时代,小红书凭借丰富的用户生成内容(UGC)和精准的推荐系统迅速崛起,成为重要的社区电商平台。为了帮助开发者高效利用平台数据,小红书开放平台提供了多种API接口,涵盖商品详情和笔记详情等。本文详细介绍了如何注册、申请权限、构建请求、处理响应及应用这些API接口,旨在为开发者提供全面的指南,助力数据驱动的决策与创新。
4967 1
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes 安全性最佳实践
【8月更文第29天】随着容器化和微服务架构的普及,Kubernetes 已成为管理容器化应用的标准平台。然而,随着 Kubernetes 的广泛采用,其安全性问题也日益受到关注。本文将深入探讨 Kubernetes 的安全最佳实践,并通过具体的代码示例来展示如何保护 Kubernetes 集群免受攻击。
644 2
|
SQL Java 关系型数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
2339 4
|
Python
python实现股票均线策略案例
此Python代码示例展示了如何运用均线策略进行股票交易模拟。它下载AAPL的股票历史数据,计算每日收益率,设置短期和长期移动平均线。当短期均线超过长期均线时,模拟买入;反之则卖出。代码遍历每一天,更新现金和股票余额,并最终计算总收益。请注意,实际交易需考虑更多因素如交易费用和风险管理。
372 2
|
存储 NoSQL 安全
Redis入门到通关之Redis数据结构-String篇
Redis入门到通关之Redis数据结构-String篇
257 1
|
机器学习/深度学习 计算机视觉
YOLOv5改进 | 二次创新篇 | 升级版本Dyhead检测头替换DCNv3 实现完美升级(全网独家首发)
YOLOv5改进 | 二次创新篇 | 升级版本Dyhead检测头替换DCNv3 实现完美升级(全网独家首发)
412 0

热门文章

最新文章