iOS开发之结合asp.net webservice实现文件上传下载

来源:互联网 发布:极光卡五星源码出售 编辑:程序博客网 时间:2024/05/29 19:04
 iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下如何结合asp.net webservice实现文件上传下载。

首先,让我们看下文件下载。

这里我们下载cnblogs上的一个zip文件。使用NSURLRequest+NSURLConnection可以很方便的实现这个功能。在asp.net webservice中可以将文件的地址返回到iOS系统,iOS系统再通过这个url去请求下载该文件。这里为了简单起见,直接将url写道代码里面了。我们可以使用两种方式去下载文件。

1、同步下载文件:

        NSString *urlAsString = @"http://files.cnblogs.com/zhuqil/UIWebViewDemo.zip";        NSURL    *url = [NSURL URLWithString:urlAsString];        NSURLRequest *request = [NSURLRequest requestWithURL:url];        NSError *error = nil;        NSData   *data = [NSURLConnection sendSynchronousRequest:request                                               returningResponse:nil                                                           error:&error];        /* 下载的数据 */        if (data != nil){            NSLog(@"下载成功");            if ([data writeToFile:@"UIWebViewDemo.zip" atomically:YES]) {                NSLog(@"保存成功.");            }            else            {                NSLog(@"保存失败.");            }        } else {            NSLog(@"%@", error);        } 


 

2、异步下载文件:DownLoadingViewController.h

////  DownLoadingViewController.h//  DownLoading////  Created by skylin zhu on 11-7-30.//  Copyright 2011年 mysoft. All rights reserved.//#import <UIKit/UIKit.h>@interface DownLoadingViewController : UIViewController {    NSURLConnection *connection;      NSMutableData *connectionData;}@property (nonatomic,retain) NSURLConnection *connection;   @property (nonatomic,retain) NSMutableData *connectionData;@end


 DownLoadingViewController.m

////  DownLoadingViewController.m//  DownLoading////  Created by skylin zhu on 11-7-30.//  Copyright 2011年 mysoft. All rights reserved.//#import "DownLoadingViewController.h"@implementation DownLoadingViewController@synthesize connection,connectionData;- (void)dealloc{    [super dealloc];}- (void)didReceiveMemoryWarning{    // Releases the view if it doesn't have a superview.    [super didReceiveMemoryWarning];        // Release any cached data, images, etc that aren't in use.}#pragma mark - View lifecycle// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.- (void)viewDidLoad{    [super viewDidLoad];    //文件地址    NSString *urlAsString = @"http://files.cnblogs.com/zhuqil/UIWebViewDemo.zip";    NSURL    *url = [NSURL URLWithString:urlAsString];    NSURLRequest *request = [NSURLRequest requestWithURL:url];    NSMutableData *data = [[NSMutableData alloc] init];    self.connectionData = data;    [data release];    NSURLConnection *newConnection = [[NSURLConnection alloc]                                      initWithRequest:request                                      delegate:self                                      startImmediately:YES];    self.connection = newConnection;    [newConnection release];    if (self.connection != nil){       NSLog(@"Successfully created the connection");    } else {        NSLog(@"Could not create the connection");    }}- (void) connection:(NSURLConnection *)connection            didFailWithError:(NSError *)error{    NSLog(@"An error happened");    NSLog(@"%@", error);}- (void) connection:(NSURLConnection *)connection              didReceiveData:(NSData *)data{    NSLog(@"Received data");    [self.connectionData appendData:data];}- (void) connectionDidFinishLoading:(NSURLConnection *)connection{    /* 下载的数据 */        NSLog(@"下载成功");        if ([self.connectionData writeToFile:@"UIWebViewDemo.zip" atomically:YES]) {            NSLog(@"保存成功.");        }        else        {            NSLog(@"保存失败.");        }      /* do something with the data here */}- (void) connection:(NSURLConnection *)connection          didReceiveResponse:(NSURLResponse *)response{    [self.connectionData setLength:0];}- (void) viewDidUnload{    [super viewDidUnload];    [self.connection cancel];    self.connection = nil;    self.connectionData = nil;}@end

从上面两段代码中可以看到同步与异步下载的区别,大部分时候我们使用异步下载文件。

上传文件

我们先使用VB.Net写一个webservice方法,用于接收上传上来的文件数据,我们可以从Request.Files中获取上传上来的文件数据。代码如下。

    <WebMethod(Description:="上传文件!")> _Public Function UploadFile() As XmlDocument        Dim doc As XmlDocument = New XmlDocument()        Try            Dim postCollection As HttpFileCollection = Context.Request.Files            Dim aFile As HttpPostedFile = postCollection("media")            aFile.SaveAs(Server.MapPath(".") + "/" + Path.GetFileName(aFile.FileName))            doc.LoadXml("<xml>ok</xml>")            Return doc        Catch ex As Exception            doc.LoadXml("<xml>fail</xml>")            Return doc        End Try    End Function


 

定义一个类PicOperation用于处理上传图片:PicOperation.h

////  PicOperation.h//  DownLoading////  Created by skylin zhu on 11-7-30.//  Copyright 2011年 mysoft. All rights reserved.//#import <Foundation/Foundation.h>@interface PicOperation : NSOperation {UIImage *theImage;}@property (retain) UIImage *theImage;@end

 

PicOperation.m:

////  PicOperation.m//  DownLoading////  Created by skylin zhu on 11-7-30.//  Copyright 2011年 mysoft. All rights reserved.//#import "PicOperation.h"#define NOTIFY_AND_LEAVE(X) {[self cleanup:X]; return;}#define DATA(X)[X dataUsingEncoding:NSUTF8StringEncoding]// Posting constants#define IMAGE_CONTENT @"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"#define STRING_CONTENT @"Content-Disposition: form-data; name=\"%@\"\r\n\r\n"#define MULTIPART @"multipart/form-data; boundary=------------0x0x0x0x0x0x0x0x"@implementation PicOperation@synthesize theImage;//创建postdata- (NSData*)generateFormDataFromPostDictionary:(NSDictionary*)dict{    id boundary = @"------------0x0x0x0x0x0x0x0x";    NSArray* keys = [dict allKeys];    NSMutableData* result = [NSMutableData data];    for (int i = 0; i < [keys count]; i++)     {        id value = [dict valueForKey: [keys objectAtIndex:i]];        [result appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];if ([value isKindOfClass:[NSData class]]) {// handle image dataNSString *formstring = [NSString stringWithFormat:IMAGE_CONTENT, [keys objectAtIndex:i]];[result appendData: DATA(formstring)];[result appendData:value];}else {// all non-image fields assumed to be stringsNSString *formstring = [NSString stringWithFormat:STRING_CONTENT, [keys objectAtIndex:i]];[result appendData: DATA(formstring)];[result appendData:DATA(value)];}NSString *formstring = @"\r\n";        [result appendData:DATA(formstring)];    }NSString *formstring =[NSString stringWithFormat:@"--%@--\r\n", boundary];    [result appendData:DATA(formstring)];    return result;}//上传图片- (NSString *) UpLoading{if (!self.theImage)NOTIFY_AND_LEAVE(@"Please set image before uploading.");        NSMutableDictionary* post_dict = [[NSMutableDictionary alloc] init];    [post_dict setObject:@"Posted from iPhone" forKey:@"message"];[post_dict setObject:UIImageJPEGRepresentation(self.theImage, 0.75f) forKey:@"media"];NSData *postData = [self generateFormDataFromPostDictionary:post_dict];[post_dict release];    NSString *baseurl = @"http://10.5.23.121:7878/WorkflowService.asmx/UploadFile";     NSURL *url = [NSURL URLWithString:baseurl];    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];    if (!urlRequest) NOTIFY_AND_LEAVE(@"Error creating the URL Request");    [urlRequest setHTTPMethod: @"POST"];[urlRequest setValue:MULTIPART forHTTPHeaderField: @"Content-Type"];    [urlRequest setHTTPBody:postData];// Submit & retrieve results    NSError *error;    NSURLResponse *response;NSLog(@"Contacting TwitPic....");    NSData* result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];    if (!result){[self cleanup:[NSString stringWithFormat:@"Submission error: %@", [error localizedDescription]]];return;}// Return results    NSString *outstring = [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease];    return outstring;}@end

这里我主要定义了两个方法,一个是generateFormDataFromPostDictionary用于创建post form data,一个是UpLoading供调用的类上传图片,这个类需要一个UIimage的对象。

类定义好了,上传图片就非常方便了,看下面代码:

    PicOperation *pic = [[PicOperation alloc] init];    pic.theImage=[UIImage imageNamed:@"meinv4.jpg"];;    NSString *result = [pic UpLoading];    NSLog(result);

总结:这篇文章讲述了如何在iOS中结合asp.net webservice实现文件的上传和下载功能。
 

原创粉丝点击