iPhone上传图片文件到服务器代码实现案例

移动开发 iOS
iPhone上传图片文件到服务器代码实现案例是本文要介绍的内容,能实现从iPhone压缩图片并上传至服务器的功能。内容主要是基于代码实现上传的功能,来看详细代码实现。

iPhone上传图片文件到服务器代码实现案例是本文要介绍的内容,能实现从iPhone压缩图片并上传至服务器的功能。内容主要是基于代码实现上传的功能,来看详细代码实现。

头文件

  1.  @interface EPUploader : NSObject {  
  2.  NSURL *serverURL;  
  3.  NSString *filePath;  
  4.  id delegate;  
  5.  SEL doneSelector;  
  6.  SEL errorSelector;  
  7.  BOOL uploadDidSucceed;  
  8. }  
  9. -   (id)initWithURL: (NSURL *)serverURL  
  10.   filePath: (NSString *)filePath  
  11.   delegate: (id)delegate  
  12.   doneSelector: (SEL)doneSelector  
  13.   errorSelector: (SEL)errorSelector;  
  14. -   (NSString *)filePath;  
  15. @end 

实现文件

  1.  #import "EPUploader.h"  
  2. #import  
  3. static NSString * const BOUNDRY = @"0xKhTmLbOuNdArY";  
  4. static NSString * const FORM_FLE_INPUT = @"uploaded";  
  5. #define ASSERT(x) NSAssert(x, @"")  
  6. @interface EPUploader (Private)  
  7. - (void)upload;  
  8. - (NSURLRequest *)postRequestWithURL: (NSURL *)url  
  9.         boundry: (NSString *)boundry  
  10.         data: (NSData *)data;  
  11. - (NSData *)compress: (NSData *)data;  
  12. - (void)uploadSucceeded: (BOOL)success;  
  13. - (void)connectionDidFinishLoading:(NSURLConnection *)connection;  
  14. @end  
  15. @implementation EPUploader  
  16. /*  
  17.  *  
  18.  *  
  19.  * -[Uploader initWithURL:filePath:delegate:doneSelector:errorSelector:] --  
  20.  *  
  21.  *   Initializer. Kicks off the upload. Note that upload will happen on a  
  22.  *   separate thread.  
  23.  *  
  24.  * Results:  
  25.  *   An instance of Uploader.  
  26.  *  
  27.  * Side effects:  
  28.  *   None  
  29.  *  
  30.  *  
  31.  */  
  32. - (id)initWithURL: (NSURL *)aServerURL   // IN  
  33.    filePath: (NSString *)aFilePath // IN  
  34.    delegate: (id)aDelegate   // IN  
  35.   doneSelector: (SEL)aDoneSelector // IN  
  36.  errorSelector: (SEL)anErrorSelector  // IN  
  37. {  
  38.  if ((self = [super init])) {  
  39.   ASSERT(aServerURL);  
  40.   ASSERT(aFilePath);  
  41.   ASSERT(aDelegate);  
  42.   ASSERT(aDoneSelector);  
  43.   ASSERT(anErrorSelector);  
  44.   serverURL = [aServerURL retain];  
  45.   filePath = [aFilePath retain];  
  46.   delegate = [aDelegate retain];  
  47.   doneSelector = aDoneSelector;  
  48.   errorSelector = anErrorSelector;  
  49.   [self upload];  
  50.  }  
  51.  return self;  
  52. }  
  53. /*  
  54.  *  
  55.  *  
  56.  * -[Uploader dealloc] --  
  57.  *  
  58.  *   Destructor.  
  59.  *  
  60.  * Results:  
  61.  *   None  
  62.  *  
  63.  * Side effects:  
  64.  *   None  
  65.  *  
  66.  *  
  67.  */  
  68. - (void)dealloc  
  69. {  
  70.  [serverURL release];  
  71.  serverURL = nil;  
  72.  [filePath release];  
  73.  filePath = nil;  
  74.  [delegate release];  
  75.  delegate = nil;  
  76.  doneSelector = NULL;  
  77.  errorSelector = NULL;  
  78.  [super dealloc];  
  79. }  
  80. /*  
  81.  *  
  82.  *  
  83.  * -[Uploader filePath] --  
  84.  *  
  85.  *   Gets the path of the file this object is uploading.  
  86.  *  
  87.  * Results:  
  88.  *   Path to the upload file.  
  89.  *  
  90.  * Side effects:  
  91.  *   None  
  92.  *  
  93.  *  
  94.  */  
  95. - (NSString *)filePath  
  96. {  
  97.  return filePath;  
  98. }  
  99. @end // Uploader  
  100. @implementation EPUploader (Private)  
  101. /*  
  102.  *  
  103.  *  
  104.  * -[Uploader(Private) upload] --  
  105.  *  
  106.  *   Uploads the given file. The file is compressed before beign uploaded.  
  107.  *   The data is uploaded using an HTTP POST command.  
  108.  *  
  109.  * Results:  
  110.  *   None  
  111.  *  
  112.  * Side effects:  
  113.  *   None  
  114.  *  
  115.  *  
  116.  */  
  117. - (void)upload  
  118. {  
  119.  NSData *data = [NSData dataWithContentsOfFile:filePath];  
  120.  ASSERT(data);  
  121.  if (!data) {  
  122.   [self uploadSucceeded:NO];  
  123.   return;  
  124.  }  
  125.  if ([data length] == 0) {  
  126.   // There's no data, treat this the same as no file.  
  127.   [self uploadSucceeded:YES];  
  128.   return;  
  129.  }  
  130. //  NSData *compressedData = [self compress:data];  
  131. //  ASSERT(compressedData && [compressedData length] != 0);  
  132. //  if (!compressedData || [compressedData length] == 0) {  
  133. //   [self uploadSucceeded:NO];  
  134. //   return;  
  135. //  }  
  136.  NSURLRequest *urlRequest = [self postRequestWithURL:serverURL  
  137.    boundry:BOUNDRY  
  138.    data:data];  
  139.  if (!urlRequest) {  
  140.   [self uploadSucceeded:NO];  
  141.   return;  
  142.  }  
  143.  NSURLConnection * connection =  
  144.  [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];  
  145.  if (!connection) {  
  146.   [self uploadSucceeded:NO];  
  147.  }  
  148.  // Now wait for the URL connection to call us back.  
  149. }  
  150. /*  
  151.  *  
  152.  *  
  153.  * -[Uploader(Private) postRequestWithURL:boundry:data:] --  
  154.  *  
  155.  *   Creates a HTML POST request.  
  156.  *  
  157.  * Results:  
  158.  *   The HTML POST request.  
  159.  *  
  160.  * Side effects:  
  161.  *   None  
  162.  *  
  163.  *  
  164.  */  
  165. - (NSURLRequest *)postRequestWithURL: (NSURL *)url  // IN  
  166.         boundry: (NSString *)boundry // IN  
  167.         data: (NSData *)data   // IN  
  168. {  
  169.  // from http://www.cocoadev.com/index.pl?HTTPFileUpload  
  170.  NSMutableURLRequest *urlRequest =  
  171.  [NSMutableURLRequest requestWithURL:url];  
  172.  [urlRequest setHTTPMethod:@"POST"];  
  173.  [urlRequest setValue:  
  174.   [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundry]  
  175.    forHTTPHeaderField:@"Content-Type"];  
  176.  NSMutableData *postData =  
  177.  [NSMutableData dataWithCapacity:[data length] + 512];  
  178.  [postData appendData:  
  179.   [[NSString stringWithFormat:@"--%@rn", boundry] dataUsingEncoding:NSUTF8StringEncoding]];  
  180.  [postData appendData:  
  181.   [[NSString stringWithFormat:  
  182.     @"Content-Disposition: form-data; name="%@"filename="file.bin"rnrn", FORM_FLE_INPUT]  
  183.    dataUsingEncoding:NSUTF8StringEncoding]];  
  184.  [postData appendData:data];  
  185.  [postData appendData:  
  186.   [[NSString stringWithFormat:@"rn--%@--rn", boundry] dataUsingEncoding:NSUTF8StringEncoding]];  
  187.  [urlRequest setHTTPBody:postData];  
  188.  return urlRequest;  
  189. }  
  190. /*  
  191.  *  
  192.  *  
  193.  * -[Uploader(Private) compress:] --  
  194.  *  
  195.  *   Uses zlib to compress the given data.  
  196.  *  
  197.  * Results:  
  198.  *   The compressed data as a NSData object.  
  199.  *  
  200.  * Side effects:  
  201.  *   None  
  202.  *  
  203.  *  
  204.  */  
  205. - (NSData *)compress: (NSData *)data // IN  
  206. {  
  207.  if (!data || [data length] == 0)  
  208.   return nil;  
  209.  // zlib compress doc says destSize must be 1% + 12 bytes greater than source.  
  210.  uLong destSize = [data length] * 1.001 + 12;  
  211.  NSMutableData *destData = [NSMutableData dataWithLength:destSize];  
  212.  int error = compress([destData mutableBytes],  
  213.            &destSize,  
  214.            [data bytes],  
  215.            [data length]);  
  216.  if (error != Z_OK) {  
  217.   NSLog(@"%s: self:0x%p, zlib error on compress:%dn",__func__, self, error);  
  218.   return nil;  
  219.  }  
  220.  [destData setLength:destSize];  
  221.  return destData;  
  222. }  
  223. /*  
  224.  *  
  225.  *  
  226.  * -[Uploader(Private) uploadSucceeded:] --  
  227.  *  
  228.  *   Used to notify the delegate that the upload did or did not succeed.  
  229.  *  
  230.  * Results:  
  231.  *   None  
  232.  *  
  233.  * Side effects:  
  234.  *   None  
  235.  *  
  236.  *  
  237.  */  
  238. - (void)uploadSucceeded: (BOOL)success // IN  
  239. {  
  240.  [delegate performSelector:success ? doneSelector : errorSelector  
  241.          withObject:self];  
  242. }  
  243. /*  
  244.  *  
  245.  *  
  246.  * -[Uploader(Private) connectionDidFinishLoading:] --  
  247.  *  
  248.  *   Called when the upload is complete. We judge the success of the upload  
  249.  *   based on the reply we get from the server.  
  250.  *  
  251.  * Results:  
  252.  *   None  
  253.  *  
  254.  * Side effects:  
  255.  *   None  
  256.  *  
  257.  *  
  258.  */  
  259. - (void)connectionDidFinishLoading:(NSURLConnection *)connection // IN  
  260. {  
  261.  NSLog(@"%s: self:0x%pn", __func__, self);  
  262.  [connection release];  
  263.  [self uploadSucceeded:uploadDidSucceed];  
  264. }  
  265. /*  
  266.  *  
  267.  *  
  268.  * -[Uploader(Private) connection:didFailWithError:] --  
  269.  *  
  270.  *   Called when the upload failed (probably due to a lack of network  
  271.  *   connection).  
  272.  *  
  273.  * Results:  
  274.  *   None  
  275.  *  
  276.  * Side effects:  
  277.  *   None  
  278.  *  
  279.  *  
  280.  */  
  281. - (void)connection:(NSURLConnection *)connection // IN  
  282.   didFailWithError:(NSError *)error     // IN  
  283. {  
  284.  NSLog(@"%s: self:0x%p, connection error:%sn",  
  285.     __func__, self, [[error description] UTF8String]);  
  286.  [connection release];  
  287.  [self uploadSucceeded:NO];  
  288. }  
  289. /*  
  290.  *  
  291.  *  
  292.  * -[Uploader(Private) connection:didReceiveResponse:] --  
  293.  *  
  294.  *   Called as we get responses from the server.  
  295.  *  
  296.  * Results:  
  297.  *   None  
  298.  *  
  299.  * Side effects:  
  300.  *   None  
  301.  *  
  302.  *  
  303.  */  
  304. -(void)    connection:(NSURLConnection *)connection // IN  
  305.    didReceiveResponse:(NSURLResponse *)response  // IN  
  306. {  
  307.  NSLog(@"%s: self:0x%pn", __func__, self);  
  308. }  
  309. /*  
  310.  *  
  311.  *  
  312.  * -[Uploader(Private) connection:didReceiveData:] --  
  313.  *  
  314.  *   Called when we have data from the server. We expect the server to reply  
  315.  *   with a "YES" if the upload succeeded or "NO" if it did not.  
  316.  *  
  317.  * Results:  
  318.  *   None  
  319.  *  
  320.  * Side effects:  
  321.  *   None  
  322.  *  
  323.  *  
  324.  */  
  325. - (void)connection:(NSURLConnection *)connection // IN  
  326.  didReceiveData:(NSData *)data    // IN  
  327. {  
  328.  NSLog(@"%s: self:0x%pn", __func__, self);  
  329.  NSString *reply = [[[NSString alloc] initWithData:data  
  330.                      encoding:NSUTF8StringEncoding]  
  331.            autorelease];  
  332.  NSLog(@"%s: data: %sn", __func__, [reply UTF8String]);  
  333.  if ([reply hasPrefix:@"YES"]) {  
  334.   uploadDidSucceed = YES;  
  335.  }  
  336. }  
  337. @end 

使用方法

  1. [[EPUploader alloc] initWithURL:[NSURL URLWithString:@"http://yourserver.com/uploadDB.php"]  
  2.  filePath:@"path/to/some/file"  
  3.  delegate:self  
  4.  doneSelector:@selector(onUploadDone:)  
  5.  errorSelector:@selector(onUploadError:)]; 

小结:iPhone上传图片文件到服务器代码实现案例的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CocoaChina
相关推荐

2024-03-14 10:51:13

服务器技术.NET Core

2015-09-28 13:39:13

Http网络协议HTTP

2015-10-10 16:46:14

HTTP网络协议文件传输

2015-10-09 09:41:24

HTTP网络协议文件传输

2015-09-29 09:25:20

HTTP网络协议

2015-10-08 09:38:24

HTTP网络协议文件传输

2022-01-10 11:52:46

Gitee服务器代码

2011-08-18 16:32:23

iPhone客户端服务器

2022-03-01 20:33:50

服务web项目

2011-08-18 15:40:20

iPhone文本切页

2011-08-19 17:02:46

iPhone开发

2020-12-02 11:48:05

TFTP

2009-11-16 10:16:24

PHP文件上传

2009-11-16 10:40:02

PHP上传文件代码

2011-07-26 16:43:59

iPhone Web 服务器

2017-03-02 11:58:31

NodeJS服务器

2018-03-23 14:48:27

静态服务器实现

2011-08-19 10:05:30

iPhone开发

2011-08-18 16:42:07

iPhone应用APNS推送

2010-08-31 22:27:11

DHCP服务器
点赞
收藏

51CTO技术栈公众号