Tumblr API - 如何上传多张图片到相册集(Photoset)?

5
我能上传一张图片,但在使用API时无法创建具有多个图像的照片集。
文档说明如下: 参数:数组(URL编码二进制内容)。 一个或多个图像文件(提交多次以创建幻灯片展示)。
请问有谁知道如何实现呢?

是的,我现在正在苦恼。不确定他们所说的 URL 编码二进制数据数组是什么意思。 - Arvin
@Arvin 我已经在Tumblr小组上开始了一次讨论。他们说问题已经解决了,但我仍然无法使其正常工作。https://groups.google.com/group/tumblr-api/browse_thread/thread/d32e0e6f9028960b/6865aa7b5eb3241d?lnk=gst&q=multiple+photos#6865aa7b5eb3241d - Milos Blasko
他们在https://gist.github.com/1198576发布了一个Python示例--但我仍然无法在Objective C中理解它(使用ASIFormDataRequest+OAuth.h)。我可以上传单个文件,但无法上传多个文件。我不认为ASIHTTPRequest在上传表单数据中“对二进制数据进行URL编码” - 这是如何完成的? - Victor Van Hee
@miloshes 你好,你是如何上传单个文件的?我还没有成功过。能提供一个例子吗?非常感谢。 - modus
4个回答

20

这是一种有点痛苦的过程,但在研究了Tumblr发布的Python代码后,我弄清楚了。简单来说,它需要获取照片的十六进制码,然后进行一些替换。

我在GitHub上创建了一个简单的iOS/iPad/iPhone项目,利用Tumblr API上传多张照片到相册集,该项目基于ASIHTTPRequest+OAuth 项目的重要内容。经过我的有限测试,它目前运作正常--请随意使用并让我知道结果如何。


@miloshes - 这个回答解决了你的问题吗?如果是的话,标记为答案和/或点赞将不胜感激。如果不是,请问你用什么编程语言来完成这个任务? - Victor Van Hee
3
@VictorVanHee,干得好!官方的tumblr API文档让我研究了几个小时。 - Jerry Tian
@VictorVanHee 哇,我简直不敢相信你让它工作了。真是个噩梦!我正在尝试用JavaScript实现这个。 stringWithoutURLEncoding是您运行十六进制数据的函数吗?替换内容是什么? 到目前为止,我已经将空格-> +和\x->%。 - gerbz
@ ggwarpig 我也不敢相信。已经这么久了,我几乎记不起自己做了什么。你想要的大部分内容都在https://github.com/vvanhee/TumblrUploadr/blob/master/NSData%2BURLEncode.m或user1569282的优化答案中。 - Victor Van Hee
@VictorVanHee 您的库支持旧版iOS,最好更新以获得新的赞。 - dahiya_boy
显示剩余2条评论

1
新的PhotoUpLink for iPhone可以上传真正的Tumblr相册。您可以从App Store免费下载http://uplink.to/5o,示例相册请访问http://photouplink.tumblr.com
Tumblr上传器基于@VictorVanHee的经验。我通过切换到纯C语言优化了代码,以便在NSData stringWithoutURLEncoding子程序中使用。
- (NSString *) stringWithoutURLEncoding
{
    NSString *hexDataDesc = [self description];
    hexDataDesc = [[hexDataDesc stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];

    int hlen = [hexDataDesc length];

    NSString *hexDataDescU = [hexDataDesc uppercaseString];

    const char *hexcString = [hexDataDescU cStringUsingEncoding:NSASCIIStringEncoding];

    char *newStringC = malloc(hlen *3);
    memset(newStringC, 0, hlen *3); 

    int xC= 0, upd = 3000, value = 0;

    char *componentC = malloc(5);   // = "XX";

    componentC[2] = 0;

    const char *px = "%x"; char ptc = '%';

    for (int x=0; x<hlen; x+=2)
    {                           
        componentC[0] = hexcString[x];
        componentC[1] = hexcString[x+1];

        value = 0;
        sscanf(componentC, px, &value);
        if ((value <=46 && value >= 45) || (value <=57 && value >= 48) || (value <=90 && value >= 65) || (value == 95) || (value <=122 && value >= 97)) //48-57, 65-90, 97-122
        {  
            newStringC[xC++] = (char)value;
        }
        else
        {
            newStringC[xC++] = ptc;
            newStringC[xC++] = (char)componentC[0];
            newStringC[xC++] = (char)componentC[1];
        }
    }

    NSString *newString = [NSString stringWithCString:newStringC encoding:NSASCIIStringEncoding];
    NSString *aNewString = [newString stringByReplacingOccurrencesOfString:@"%20" withString:@"+"];

    free (newStringC);
    free (componentC);

    return aNewString;
}

0

0

这很简单,如果您只有一张图片要上传,可以使用“source”参数。如果有多张图片,请将参数切换为“data”,并用图像URL数组进行初始化。对于PHP Tumblr客户端,可以使用以下片段:

$paramsToPost = [
    'type' => 'photo',
    'tags' => 'tag1, tag2, tag2',
    'caption' => 'caption for photo(s)',
    'link' => 'http://example.com/click-through-url'
];
if (is_array($imageData)) {
    $paramsToPost['data'] = $imageData;
} else {
    $paramsToPost['source'] = $imageData;
}
$client = new Tumblr\API\Client($consumerKey, $consumerSecret);
$client->setToken($token, $tokenSecret);
$response = $client->createPost($blogName, $paramsToPost);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接