当前位置: 首页 > news >正文

织梦cms网站更新深圳 商城 网站建设

织梦cms网站更新,深圳 商城 网站建设,寻找郑州网站优化公司,有哪个理财网站是专门做汽车抵押的引言 在移动应用中#xff0c;图片上传是一个常见的功能#xff0c;尤其是在个人中心或社交平台场景中#xff0c;用户经常需要上传图片到服务器#xff0c;用以展示个人风采或记录美好瞬间。然而#xff0c;实现多图片上传的过程中#xff0c;如何设计高效的上传逻辑并… 引言 在移动应用中图片上传是一个常见的功能尤其是在个人中心或社交平台场景中用户经常需要上传图片到服务器用以展示个人风采或记录美好瞬间。然而实现多图片上传的过程中如何设计高效的上传逻辑并结合用户体验显得尤为重要。 本篇博客将通过一个具体实例——个人中心的相册功能来介绍如何使用 Alamofire 实现多文件上传。我们将从图片选择开始逐步实现图片数据的封装、上传请求的构建以及上传进度的展示最终完成一套完整的多图片上传解决方案。如果你也正在寻找一种高效的实现方法希望本文能为你提供一些思路与启发。 功能需求分析 用户的个人信息页面会展示用户的一些精选照片墙为了补充这个信息在用户编辑页添加了的上传相册图片的功能上传到相册的图片最多为6张可以多选但是已选择和已上传的总数不能超过6。 关于相册选择我们可以使用系统为我们提供的PHPickerViewController来实现使用起来十分方便可以直接设置选择资源类型和最大个数关于它的使用在之前的博客中也有过介绍有兴趣的同学可以看下面这篇博客。 iOS 系统提供的媒体资源选择器PHPickerViewController-CSDN博客文章浏览阅读1.6k次点赞10次收藏20次。在前面的博客中我们已经介绍了一个系统为我们提供的媒体选择器UIImagePickerController它的功能很强大但是唯一的不足就是只能选取单个媒体资源而PHPickerViewController恰恰弥补了这一空缺。PHPickerViewController是iOS 14及更高版本中引入的一个现代化媒体选择器旨在替代UIImagePickerController。它不仅提供了更灵活的媒体选择功能还拥有更现代的用户界面。_phpickerviewcontrollerhttps://blog.csdn.net/weixin_39339407/article/details/140918416选择了相册的图片之后下一步就上传图片资源到相册。Alamofire为我们提供了完整的上传方法但是由于我们需要上传多个资源所以仍然有一些数据来需要我们处理。 接口设计 在讨论如何实现多文件上传之前我们首先需要了解一下后端的接口设计每个服务端对于文件上传的方式都并不是一成不变的。 在上传相册图片的需求中整个过程被分成了两个接口 文件上传接口负责文件上传需要设置文件的类型以及自定义参数来决定文件上传是用来做什么的每次只能上传一个文件。会返回上传后的资源地址。相册更新接口使用上传后的资源地址构建列表来更新相册。 代码实现 那我们跳过关于UI的布局刷新以及照片的选择功能将所有精力集中到文件上传照片选择完成之后会传递回来一个等待上传的图片数组为了更符合业务场景我们需要根据图片数组来构建一组新的相册模型并添加到相册列表然后执行上传操作。 选择照片后的处理 /// 选择相册图片/// - Parameter images: 图片数组func uploadAlbum(images: [UIImage]) {//1. 先刷新for image in images {let model MWEditPhotoModel()model.image imagemodel.uploadStatus .noneeditUserPhotos.append(model)}self.tableView.reloadData()//2.开始执行上传操作self.presenter.requestUploadAlbumData(editPhotoModels: editUserPhotos) {[weak self] inguard let self self else { return }self.tableView.reloadData()}}根据选择上传的图片数组构建新的相册模型并添加到相册列表中刷新列表。将整个相册列表当做参数传递到上传方法中。 首先会根据传递进来的相册列表数据进行过滤获取到需要上传的进行上传 /// 信号量最大并发控制为2private let semaphore DispatchSemaphore(value: 2)/// 上传用户相册func requestUploadAlbumData(editPhotoModels:[MWEditPhotoModel], completion: (() - Void)?) {uploadAlbumCompletion completion// 获取需要上传的模型let needUploadModels editPhotoModels.filter { $0.uploadStatus .none $0.isAdd false }// 上传图片var needUploadCount needUploadModels.countlet semaphore self.semaphoreglobalQueue.async {[weak self] inguard let self self else {return}for model in needUploadModels {model.uploadStatus .uploadingsemaphore.wait()MWLogHelper.debug(开始上传图片,context: MWEditProfilePresenter)self.uploadAlbumImages(model) {[weak self] success inMWLogHelper.debug(上传图片结果\(success),context: MWEditProfilePresenter)defer {// 无论结果如何确保释放信号量semaphore.signal()}guard let self self else {return}if success false {model.uploadStatus .fail}needUploadCount - 1if needUploadCount 0 {self.requestUpdateAlbumData(editPhotoModels: editPhotoModels)}}}}} 首先创建了一个信号量来控制可以同时上传的最大个数。过滤出需要上传的数据执行上传操作。当所有资源上传完成之后在根据列表数据来更新相册。 那我们先来看一下上传方法 // 上传相册图片private func uploadAlbumImages(_ editPhotoModel: MWEditPhotoModel,complection:((Bool)-Void)? nil) {guard let imageData editPhotoModel.image?.compressImageQuality(maxSize: Int(640 * 640)) else {complection?(false)return}MWNetworkHelper.upLoadFile(data: imageData, kinds: photo, fileType: MWUploadFileType.image, fileName: photo.jpg) { result inif let imageUrl result?[photo] {var albumModel MWProfileAlbumModel()albumModel.littleUrl imageUrlalbumModel.srcUrl imageUrleditPhotoModel.albumModel albumModeleditPhotoModel.uploadStatus .successcomplection?(true)} else {editPhotoModel.uploadStatus .failcomplection?(false)}} notRedirectErrorCallback: {complection?(false)MWToast.showToast(MWLocaleStringHelper.getString(Upload Failed))}} /// 上传文件/// - Parameters:/// - data: 文件数据/// - kinds: 参数/// cover 封面, facebookSharedImage 分享, portrait 头像, pic 图片, zip 压缩包, video 视频, , ,photo 相册, photoProcess 相册模糊, liveCover 直播间封面 photoWall, 个人主页, photoWallBig 个人主页大图/// - fileType: 文件类型/// - fileName: 文件名称/// - completion: 上传结果public class func upLoadFile(data: Data, kinds: String, fileType: MWUploadFileType, fileName: String, completion: escaping (([String: String]?) - Void), notRedirectErrorCallback: escaping () - Void) {// 上传地址var url \(MWAPIHost.host)/rest/api/usergate/uploadFile// 上传headervar headers [String:String]()// 重定向let redirectHandler MWRedirectHandler(data: data, kinds: kinds, fileType: fileType, fileName: fileName, completion: completion)AF.upload(multipartFormData: { multipartFormData in//图片var mimeType image/jpgif fileType .video {mimeType video/mp4}multipartFormData.append(data, withName: file,fileName: fileName, mimeType: mimeType)// 上传 kinds 参数if let kindsData kinds.data(using: .utf8) {multipartFormData.append(kindsData, withName: kinds)}}, to: url,method: .post, headers: MWAPIEncryEndpoint.api_postDynamic.headers).redirect(using: redirectHandler).responseJSON { response inif response.response?.statusCode ! 307 {notRedirectErrorCallback()}}} 文件名称和文件类型需要根据文件的具体内容来设置。kinds为服务端自定的参数。关于重定向的暂且可以不考虑我们的文件上传接口进行了接口的重定向一般来讲是不需要单独处理的。文件上传成功之后根据返回结果构建了新的相册数据并同步到相册列表。 最后我们只需要等待所有文件上传完成之后将所有数据同步到相册接口即可 /// 更新用户相册/// - Parameters:/// - editPhotoModels: 编辑相册模型/// - completion: 完成回调func requestUpdateAlbumData(editPhotoModels:[MWEditPhotoModel]) {let needUpdateModels editPhotoModels.filter { $0.uploadStatus .success || $0.uploadStatus .noNeed }let albumList needUpdateModels.map { $0.albumModel }var photoList [[String: Any]]()for albumModel in albumList {var dict [String: Any]()dict[littleUrl] albumModel?.littleUrldict[srcUrl] albumModel?.srcUrlphotoList.append(dict)}let params: [String: Any] [photoList: photoList]MWNetworkHelper.request(endpoint: MWAPIEncryEndpoint.api_updateUserPhotos, parameters: params) {[weak self] (model, data, error) inguard let self self else { return }if error ! nil {for model in needUpdateModels {if model.uploadStatus .success {model.uploadStatus .fail}}}self.uploadAlbumCompletion?()}} 结语 本篇博客主要介绍了使用Alamofire实现多文件的上传功能关于文件上传的具体方案还是需要根据服务端的接口设计来实施。本文以同步用户相册为例将上传相册图片分为两个部分上传和同步当所有资源上传完成之后执行相册的同步操作。并使用信号量来控制上传的最大并发数。 希望本篇博客能够在文件上传中给大家一些启发。
http://www.hkea.cn/news/14411812/

相关文章:

  • 经典网站建设方案深圳软件外包公司都有哪些
  • 接网站开发的公司电话wordpress主题极简
  • 去除 做网站就用建站之星wordpress 获取标签id
  • 法华寺网站建设手机做任务网站
  • 如何用手机建设一个网站360建筑网撤销挂证
  • 建筑行业官方网站域名备案掉了网站还可以用吗
  • 网站模板设计教程怎么样做企业模板网站
  • 手机移动网站设计泰州网站建设优化建站
  • c语言程序设计网站WordPress论坛小程序
  • 天津做网站的公dw网页设计成品免费学霸
  • 柳州企业网站制作海外免备案网站
  • 网站集约化建设力度自己做有趣的网站
  • 网站代理怎么赚钱网站开发公司北京
  • 小白如何学电商运营wordpress优化服务
  • 青海省制作网站专业wordpress仿dz
  • 网站关键词数量减少做网站建设的联系电话
  • 北京制作网站的公司简介酒店类网站建设开发书
  • 做网站建设还有钱赚吗高校网站建设策划
  • 闲鱼钓鱼网站怎么制作网站开发属于什么部门
  • 东营市垦利区胜坨填建设站的网站深圳宣传片制作排名前十名
  • 上饶网站优化东莞百度seo哪里强
  • 网站开发需要读的书籍h5网站建设h
  • 潍坊网站制作人才招聘wordpress采集插件中文
  • 盐山联通大厦 网站建设成品网站怎么被百度收录
  • 室内设计师个人网站购物网站建设需求模板
  • 大理市城乡建设局网站一个主机域名可以做多少个网站
  • 外贸企业网站优化京东网站是刘强冬自己做的吗
  • 贸易公司做推广的网站200元网站建设
  • 上海 政务网站建设情况ps怎么做网站模板
  • 常用的博客建站程序现在做网站开发