0

嗨,我已经完成了不倒翁中的状态更新,但是当我以数据形式发送照片时遇到问题,如下所示。

-(IBAction)sendPhoto
{
    NSString *email           = @"user_name@gmail.com";
    NSString *password        = @"password";
    NSString *sendType = @"photo";

    UIImage *imageMS = [UIImage imageNamed:@"Submit.png"];
    NSData *photoData = [[NSData alloc] initWithData:UIImagePNGRepresentation(imageMS)];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL URLWithString:@"http://www.tumblr.com/api/write"]];
    [request setHTTPMethod:@"POST"];
    NSString *request_body = [NSString 
            stringWithFormat:@"email=%@&password=%@&type=%@&data=%@",
            [email           stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            [password        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            [sendType        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            photoData];
    [request setHTTPBody:[request_body dataUsingEncoding:NSUTF8StringEncoding]];
    [web loadRequest:request];
}

但它没有得到更新。为什么?

4

2 回答 2

2

我原来的答案被证明是不正确的,但是 OP 发布了一个他说解决了他的问题的代码链接。我在下面复制了该代码,以便将来的搜索者可以轻松找到它,因为我知道看到您描述的问题并找到解决方案的链接只是让该链接失效是多么令人沮丧。

基于http://forums.macrumors.com/showthread.php?t=427513的代码:

- (BOOL)sendPhotoToTumblr:(NSString *)photo usingEmail:(NSString *)tumblrEmail andPassword:(NSString *)tumblrPassword withCaption:(NSString *)caption;
{
    //get image data from file
    NSData *imageData = [NSData dataWithContentsOfFile:photo];  
    //stop on error
    if (!imageData) return NO;

    //Create dictionary of post arguments
    NSArray *keys = [NSArray arrayWithObjects:@"email",@"password",@"type",@"caption",nil];
    NSArray *objects = [NSArray arrayWithObjects:
            tumblrEmail,
            tumblrPassword,
            @"photo", caption, nil];
    NSDictionary *keysDict = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];

    //create tumblr photo post
    NSURLRequest *tumblrPost = [self createTumblrRequest:keysDict withData:imageData];
    [keysDict release];     

    //send request, return YES if successful
    tumblrConnection = [[NSURLConnection alloc] initWithRequest:tumblrPost delegate:self];
    if (!tumblrConnection) {
        NSLog(@"Failed to submit request");
        return NO;
    } else {
        NSLog(@"Request submitted");
        receivedData = [[NSMutableData data] retain];
            [tumblrConnection release];
        return YES;
    }
}


-(NSURLRequest *)createTumblrRequest:(NSDictionary *)postKeys withData:(NSData *)data
{
    //create the URL POST Request to tumblr
    NSURL *tumblrURL = [NSURL URLWithString:@"http://www.tumblr.com/api/write"];
    NSMutableURLRequest *tumblrPost = [NSMutableURLRequest requestWithURL:tumblrURL];
    [tumblrPost setHTTPMethod:@"POST"];

    //Add the header info
    NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
    [tumblrPost addValue:contentType forHTTPHeaderField: @"Content-Type"];

    //create the body
    NSMutableData *postBody = [NSMutableData data];
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //add key values from the NSDictionary object
    NSEnumerator *keys = [postKeys keyEnumerator];
    int i;
    for (i = 0; i < [postKeys count]; i++) {
        NSString *tempKey = [keys nextObject];
        [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",tempKey] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[[NSString stringWithFormat:@"%@",[postKeys objectForKey:tempKey]] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    }

    //add data field and file data
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"data\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[NSData dataWithData:data]];
    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //add the body to the post
    [tumblrPost setHTTPBody:postBody];

    return tumblrPost;
}

我已经修改了上面的代码以消除一些内存问题并添加一些参数以使其成为更通用/更灵活的解决方案。但是,如果有人想要该站点上发布的原始代码,只需查看此答案的编辑修订。

于 2011-03-15T15:17:35.733 回答
0

为了将来参考,ASIHTTPRequest的 ASIFormDatRequest 使这种事情变得更容易。

于 2011-03-16T13:39:03.903 回答