swift 传输文件到服务器_xcode swift工程 创建swift类的扩展文件 - CSDN
  • 本文根据另一份OC上传文件的代码改写而来 改写后的 swift 代码如下 //MARK: UploadFile class UploadFile {  // 拼接字符串  let boundaryStr = "--" // 分隔字符串  let randomIDStr = "----------...

    本文根据另一份OC上传文件的代码改写而来


    改写后的 swift 代码如下

    //MARK: UploadFile

    class UploadFile {

        // 拼接字符串

        let boundaryStr = "--"  // 分隔字符串

        let randomIDStr ="----------thinkyouitcast---------"  //本次上传标示字符串

        let uploadID ="uploadFile" // 上传(php)脚本中,接收文件字段

        

        private func topStringWithMimeType(mimeType:String, uploadFile: String)->String{

            let strM = NSMutableString()

            strM.appendString("\(boundaryStr)\(randomIDStr)\n")

            strM.appendString("Content-Disposition: form-data; name=\"\(uploadID)\"; filename=\"\(uploadFile)\"\n")

            strM.appendString("Content-Type:\(mimeType)\n\n")

            return strM as String

        }

        

        private func bottomString()->String{

            let strM = NSMutableString()

            strM.appendString("\(boundaryStr)\(randomIDStr)\n")

            strM.appendString("Content-Disposition: form-data; name=\"submit\"\n\n")

            strM.appendString("Submit\n")

            strM.appendString("\(boundaryStr)\(randomIDStr)--\n")

            return strM as String

        }

        

        //MARK: 上传文件

        func uploadFileWithURL(url: NSURL, data: NSData, completionHandler handler:((response:NSURLResponse?, data: NSData?, connetionError: NSError?) -> Void)){

            // 1> 数据体

            let topStr: NSString = self.topStringWithMimeType("image/png", uploadFile:"头像1.png")

            let bottomStr: NSString = self.bottomString()

            

            let dataM = NSMutableData()

            dataM.appendData(topStr.dataUsingEncoding(NSUTF8StringEncoding)!)

            dataM.appendData(data)

            dataM.appendData(bottomStr.dataUsingEncoding(NSUTF8StringEncoding)!)

            

            // 1.Request

            let request = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval:2.0)

            

            // dataM出了作用域就会被释放,因此不用copy

            request.HTTPBody = dataM

            

            // 2> 设置Request的头属性

            request.HTTPMethod = "POST"

            

            // 3> 设置Content-Length

            let strLength = "\(data.length)"

            request.setValue(strLength, forHTTPHeaderField:"Content-Length")

            

            // 4> 设置Content-Type

            let strContentType ="multipart/form-data; boundary=\(randomIDStr)"

            request.setValue(strContentType, forHTTPHeaderField:"Content-Type")

            

            // 3> 连接服务器发送请求

            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) ->Void in

                handler(response: response, data: data, connetionError: error)

            }

            

            task.resume()

            

            //@available(iOS, introduced=5.0, deprecated=9.0, message="Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSession.h")

            //        NSURLConnection.sendAsynchronousRequest(<#T##request: NSURLRequest##NSURLRequest#>, queue: <#T##NSOperationQueue#>, completionHandler: <#T##(NSURLResponse?, NSData?, NSError?) -> Void#>)

        }

    }

    // 测试

    func test(){

        

        let url = ("http://***.com/api/crmUpFile.ashx")

        let image =UIImage(named:"ic_background_320_230")

        let imageData = UIImagePNGRepresentation(image!)

        

        UploadFile().uploadFileWithURL(NSURL(string: url)!, data: imageData!) { (response, data, error) ->Void in

            let str = NSString(data: data!, encoding: NSUTF8StringEncoding)

            print("\(str)")

        }

        

    }



    原OC代码也贴在此


    @interface UploadFile : NSObject

    - (void)uploadFileWithURL:(NSURL *_Nonnull)url data:(NSData *_Nonnull)data

            completionHandler:(void (^ __nullable)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler;

    @end

    @implementation UploadFile

    // 拼接字符串

    static NSString *boundaryStr =@"--";   // 分隔字符串

    static NSString *randomIDStr;          // 本次上传标示字符串

    static NSString *uploadID;             // 上传(php)脚本中,接收文件字段


    - (instancetype)init

    {

        self = [superinit];

        if (self) {

            randomIDStr =@"----------thinkyouitcast---------";

            uploadID =@"uploadFile";

        }

        return self;

    }


    #pragma mark - 私有方法

    - (NSString *)topStringWithMimeType:(NSString *)mimeType uploadFile:(NSString *)uploadFile

    {

        NSMutableString *strM = [NSMutableStringstring];

        

        [strM appendFormat:@"%@%@\n",boundaryStr, randomIDStr];

        [strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\n",uploadID, uploadFile];

        [strM appendFormat:@"Content-Type: %@\n\n", mimeType];

        

    //    NSLog(@"%@", strM);

        return [strM copy];

    }


    - (NSString *)bottomString

    {

        NSMutableString *strM = [NSMutableStringstring];

        

        [strM appendFormat:@"%@%@\n",boundaryStr, randomIDStr];

        [strM appendString:@"Content-Disposition: form-data; name=\"submit\"\n\n"];

        [strM appendString:@"Submit\n"];

        [strM appendFormat:@"%@%@--\n",boundaryStr, randomIDStr];

        

    //    NSLog(@"%@", strM);

        return [strM copy];

    }


    #pragma mark - 上传文件

    - (void)uploadFileWithURL:(NSURL *)url data:(NSData *)data

            completionHandler:(void (^)(NSURLResponse*__nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler {

        // 1> 数据体

        NSString *topStr = [selftopStringWithMimeType:@"image/png"uploadFile:@"头像1.png"];

        NSString *bottomStr = [selfbottomString];

        

        NSMutableData *dataM = [NSMutableDatadata];

        [dataM appendData:[topStrdataUsingEncoding:NSUTF8StringEncoding]];

        [dataM appendData:data];

        [dataM appendData:[bottomStrdataUsingEncoding:NSUTF8StringEncoding]];

        

        // 1. Request

        NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url cachePolicy:0timeoutInterval:2.0f];

        

        // dataM出了作用域就会被释放,因此不用copy

        request.HTTPBody = dataM;

        

        // 2> 设置Request的头属性

        request.HTTPMethod = @"POST";

        

        // 3> 设置Content-Length

        NSString *strLength = [NSStringstringWithFormat:@"%ld", (long)dataM.length];

        [request setValue:strLength forHTTPHeaderField:@"Content-Length"];

        

        // 4> 设置Content-Type

        NSString *strContentType = [NSStringstringWithFormat:@"multipart/form-data; boundary=%@",randomIDStr];

        [request setValue:strContentType forHTTPHeaderField:@"Content-Type"];

        

        // 3> 连接服务器发送请求

        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueuealloc] init]completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) {

            

    //        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    //        NSLog(@"%@", result);

            handler(response,data,connectionError);

        }];

    }


    展开全文
  • Swift文件问题

    2013-03-25 11:25:54
    文件问题 官方在线文档:...传输超过5G的大文件时,需要使用-S参数,指定将大文件分块存储,-S 指明了分块的大小。例如:swift –V 2.0 –A http://localhost:5000/v2.0-U admin:admin -K adm

    大文件问题

    官方在线文档:http://docs.openstack.org/developer/swift/overview_large_objects.html

     

    传输超过5G的大文件时,需要使用-S参数,指定将大文件分块存储,-S 指明了分块的大小。例如:swift –V 2.0 –A http://localhost:5000/v2.0-U admin:admin -K adminpasswd upload test-container –S 1073741824 big_file

     

    这个命令将文件big_file分块传输,块的大小为1073741824字节,也就是1G。假如big_file大小为10G,那么客户端(这里指python-swiftclient)会将文件切分为10块,而且可以并行上传这些分块。

     

    问题一:从上面的命令中可以看出,提供认证的keystone服务和swift部署在了同样一台服务器上,在upload阶段,swift的account server会与keystone交互,大文件分块并行上传时,本地服务器带宽几乎被占满,很容易造成account server与keystone服务器交互发生超时,使得大文件上传失败。(proxy日志中可看出)

    解决思路:部署时将keystone和swift分开,keystone和swift的proxyserver之上都加一层负载均衡。

     

     

    问题二:swift的data目录下,有一个tmp目录,用来临时保存上传的文件。问题一中的认证超时会造成若干文件块上传失败,失败后swift并不会将tmp目录清空,与这次未成功的上传相关的临时文件没有被删除,这可能导致服务器存储空间的大量浪费。

    解决思路:改进swift object server

    展开全文
  • 使用CocoaHTTPServer框架实现wifi局域网传输文件到iPhone的功能
  • 在开发过程中我们可能会需要把IOS上传java服务器。 IOS端 首先我们来观察下在form表单中上传文件到服务中http header中的内容。 红色框里面是我们需要的内容。 再观察wireshark中所发送的data的内容 然后...

    在开发过程中我们可能会需要把IOS上传到java服务器。
    IOS端
    首先我们来观察下在form表单中上传文件到服务中http header中的内容。
    这里写图片描述
    红色框里面是我们需要的内容。
    再观察wireshark中所发送的data的内容
    这里写图片描述

    然后我们根据上文中的内容为需要发送的文件的data数据中添加必要的内容。
    模仿下面红色框的格式。
    定义data:注意需要完全按照wireshark中的格式来,一定要带上”\r\n”
    格式:
    –boundary
    Content-Disposition:form-data;name=”表单控件名称”;filename=”上传文件名称”
    Content-Type:文件MIME Types

    文件二进制数据;

    —boundary–

    //构造Content-Type
    
        NSMutableData *uData = [NSMutableData data];
        //Content-Type head
        NSString *strTop = [NSString stringWithFormat:@"------%@\r\nContent-Disposition: form-data; name=\"file1\"; filename=\"%@\"\r\nContent-Type: %@\r\n\r\n",BODUNDARY_STRING,fileName,[self mimeType:fileName]];
        //Content_Type foot
        NSString *strBottom = [NSString stringWithFormat:@"\r\n------%@--\r\n",BODUNDARY_STRING];
    
        //文件数据
        NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
        NSData *uploadData = [NSData dataWithContentsOfFile:filePath];
        if (!uploadData) {
            NSLog(@"no uploadData!!");
        }
        [uData appendData:[strTop dataUsingEncoding:NSUTF8StringEncoding]];
        [uData appendData:uploadData];
        [uData appendData:[strBottom dataUsingEncoding:NSUTF8StringEncoding]];

    其实data的格式为前后都是boundary,可以为任何字符串。中间为我们需要上传的文件内容

    在IOS中我们可以通过NSURLSessionUploadTask来上传文件。
    首先定义一个NSURLRequest

    NSURL *url = [NSURL URLWithString:[@"http://localhost:8080/IOS/upload/file.do"stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];//为了可以传递中文指定字符集
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0f];
    

    然后为request添加必要的内容

    [request setHTTPMethod:@"POST"];
        //数据体
        [request setHTTPBody:uploadData];
        //设置请求头
        [request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)uploadData.length] forHTTPHeaderField:@"Content-Length"];
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=----%@",BODUNDARY_STRING] forHTTPHeaderField:@"Content-Type"];//多部分表单数据,支持浏览器访问,不进行任何编码,通常用于文件传输(此时传递的是二进制数据) 。
    

    然后上传文件

    NSURLSessionUploadTask *_task = [[self session] uploadTaskWithRequest:request fromData:uploadData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"系统提示" message:dataStr preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
            [alert addAction:sureAction];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self presentViewController:alert animated:YES completion:nil];
            });
        }];

    JAVA端
    java端采用了springMVC框架。
    1.导入commons-fi’leupload-1.3.1.jar
    2.在springMVC配置文件中定义如下

    <!-- 上传 -->  
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

    3.在对应的Controller中的具体方法

    @Controller
    @RequestMapping(value = "/upload")
    public class UploadController {
    
        @RequestMapping(value = "/file.do",method = RequestMethod.POST)
        @ResponseBody
        public String upload(MultipartHttpServletRequest muiltRequest,HttpServletRequest servletRequest) throws Exception{
            String resultString = "";
            String filename = "";//源文件名
            String fileName = muiltRequest.getFileNames().next(); //得到文件名(注意。是content-type 中的name="file1",而不是真正的文件名)
            MultipartFile file = muiltRequest.getFile(fileName);   //得到该文件
            if (file.getOriginalFilename().length() > 0) {
    
                filename = new String(file.getOriginalFilename().getBytes("ISO-8859-1"),"UTF-8");//中文转码,得到源文件名
    
                //得到工程文件目录
                String path = this.getClass().getResource("/").getPath();
                path = path.replaceAll("(.)/\\..*", "$1") + servletRequest.getContextPath(); //到工程目录
                String filePath = path + "/WebContent/upload";
    
                File uploadFile = new File(filePath,     //建立本地文件
                        filename);
    
                InputStream inputStream = file.getInputStream();
                FileUtils.copyInputStreamToFile(inputStream,  //把获取的文件存储到指定位置
                        uploadFile);
                        filename = new String(filename.getBytes(),"ISO-8859-1");//转码返回
            resultString = filename + " upload Success";
            }
    
            return resultString;
    

    这样就完成了IOS上传文件到java服务器。这里需要注意的是。在定义header的时候。\r\n一定要带上。可根据wireshark中的格式写。否则在服务器端会出错。

    展开全文
  • 用最新的 Alamofire(swift 4.1) (带参数)上传图片到服务器 1,准备参数 let image = UIImage(named: "xxx") //将图片转化为JPEG类型的data 后面的参数是压缩比例 let jpegImage = ...

    用最新的 Alamofire(swift 4.1) (带参数)上传图片到服务器

    1,准备参数

    let image = UIImage(named: "xxx")
    //将图片转化为JPEG类型的data 后面的参数是压缩比例
    let jpegImage = UIImageJPEGRepresentation(image!, 0.5)
    //要传的参数(比如我们带用户的加密uid)
     let uid = ["uid" : user.uid]
     let ecodeUid = EncryptionHelper.getParamsString(uid as [String : AnyObject])
     //将参赛转化为data
    let ecodeData = ecodeUid.data(using: .utf8)

    2,开始上传

    //全部代码如下
    Alamofire.upload(multipartFormData: { (multipartFormData) in
        multipartFormData.append(ecodeData!, withName: "data")
        multipartFormData.append(jpegImage!, withName: "avatar", fileName: "avatar"+".jpeg", mimeType: "image/jpeg")
                }, to: "https://www.ka5188.com/app/api/v1/user/uploadImg" , encodingCompletion: { encodingResult in
                    ws!.hideLoading()
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { response in
                            if let data = response.data {
                                let responseJson = JSON(data: data)
                                if responseJson["status"].intValue == 1 {
                                    //上传成功,刷新当前头像
                                    }
                                } else {
                                   let msg = responseJson["msg"].stringValue
                                   self.showMessage(msg)
                                }
                            }
                        }
                    case .failure(let encodingError):
                        log.debug(encodingError)
                        self.showMessage("上传图片失败")
                    }
                })

    说明和注意点

    //需要注意的地方 
     multipartFormData.append(ecodeData!, withName: "data")
    //第一个参数"ecodeData",就是我们加密的二进制uid
    /第二个参数"data"
    服务端以这个字段名获取加密的uid(个人以为应该用"uid")
    
    multipartFormData.append(jpegImage!, withName: "avatar", fileName: "avatar"+".jpeg", mimeType: "image/jpeg")
    //带一个参数"jpegImage",就是我们加密的二进制图片流
    //带二个参数"withName",后台通过西字段来获取图片
    //带三个参数"fileName",后台检图片类型的,主要是后缀名
    //带四个参数"mimeType",传输的文件类型。
    注 : 1,开始由于第二个参数和第三个参数弄混了,导制上传失败
          2,由于第三个参数没有加后缀".jpeg",导致后台输出(文件格式不支持)
          3,第三个参数mimeType 传入类型是图片
          下面给出官方解释,还有我们后台php部分代码
    

    #

    官方解释如下

    image

    后端代码

    image

    附:一个优雅的图片处理库
    欢迎查看DDGScreenShot

    其余功能如下

    1. (一)DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)
    2. (二)DDGScreenShot–iOS 图片处理–多图片拼接
    3. (三)DDGScreenShot–iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法
    4. (四)DDGScreenShot—图片擦除功能
    5. (六)DDGScreenShot —图片加各种滤镜高逼格操作
    6. (七)DDGScreenShot —图片加高斯模糊,老电影效果
    展开全文
  • 如今手机发展非常迅速,app的种类也琳琅满目,而... 如上面的app截图中的功能,现在越来越多的app都具有了在电脑上通过网页wifi传输文件到手机端的功能,不仅有文字类,也有图片类,还有视频类,前提是电脑和手机都...
  • 另外,网上的大部分代码并不提供后台,对于并不了解文件后台接收的swift学习爱好者来说是头疼的。其次,对于视频上传的网上中文资料少之又少,大多数都是一些图片(小文件)上传,没有尝试上传视频
  • 在常规的web开发过程中,大部分上传文件都是在web页面端通过表单直接提交,再由服务器端捕获请求来进行处理的。但是在前后端分离趋于一种流行趋势,再加上Android和iOS开发技术日渐成熟,大部分团队都会选择在服务器...
  • Benefits of the Top Server-Side Swift Frameworks 作者:Ryan Collins 译者:Rocky Wei 【CSDN 有奖征稿啦】技术之路,共同进步,欢迎投稿、给文章纠错,请发送邮件至mobilehub@csdn.net,或加微信 tree-...
  • OpenStack Swift学习笔记

    2014-01-10 10:31:10
    Swift并不是文件系统或者实时的数据存储系统,它是对象存储,用于永久类型的静态数据的长期存储,这些数据可以检索、调整,必要时进行更新。最适合存储的数据类型的例子是虚拟机镜像、图片存储、邮件存储和存档备份...
  • Perfect:Swift 语言服务器端软件框架 Perfect 开源项目 参与 Perfect 开发 Slack 在线协同 Perfect:Swift 语言服务器端软件框架 Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在Linux、iOS...
  • openstack官网有专门的开发者文档介绍如何使用curl操作swift...请官网阅读,内容还是很详细的,本文只是向希望了解swift对象存储的朋友做个直观的展示...
  • 基于P2P文件传输

    2013-05-13 23:09:52
    基于P2P文件传输 1. P2P简介 对等网络P2P(peer-to-peer)技术是一种用于不同计算机用户之间,不经过中继设备直接交换数据或服务的技术,其网络通信方式如下图所示: P2P技术打破了传统的Client/Server模式,...
  • Swift

    2018-10-30 14:59:57
    1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...OpenStack Object Storage(Swift)是...Swift并不是文件系统或者实时的数据存储系统,它是对象存储,用于永久类型的静态数据的长期存储,这些数据可以检索、...
  • 前段时间听说swift5的改变之一是ABI稳定,现在看的话,swift是值得学习的,于是想通过搭建自己的博客来学习swift,顺便了解后端和mysql,以及前端页面的一些样式. 博客传送门 博客项目放在了github,喜欢的可以点赞. ...
  • 有一些传输软件条件非常苛刻,而且很慢,或者Mac用户想要传输到win上,也是各种不方便,Mac文件共享,小编推荐这些FTP传输工具,轻松搞定传输问题~ Cyberduck - 免费 FTP,SFTP,S3 和 WebDAV 客户端 Cyberduck 是一...
  • Swift 开源项目汇总

    2019-09-16 16:07:05
    Swift 开源项目汇总
  • 存储入门存储技术:DAS(Direct Attached Storage):将存储设备通过SCSI线缆或FC(FiberChannel)直接连接到服务器上。NAS(Network Attached Storage):按照TCP/IP协议进行通信,以文件的I/O方式进行数据传输。它拥有...
  • 第二章:OpenStack架构OpenStack Swift是神奇的,它将一组无关的廉价商品存储服务器转变成可扩展的,耐久的,便于管理的存储系统.我们将通过理解对象逻辑结构和Swift怎样虚拟化底层硬件去组织数据来具体分析Swift的架构...
1 2 3 4 5 ... 20
收藏数 3,868
精华内容 1,547
关键字:

swift 传输文件到服务器