[Developers] Problems uploading images

Aseem Mohanty aseem at metaweb.com
Mon Jan 7 21:11:07 UTC 2008


Hi Indy.

The raw_upload service behaves exactly as you described. If you want to 
use a form based POST to upload files, you can use the form_upload 
service which will process a CURLOPT_POSTFIELDS request properly. The 
raw upload service expects the data to be in the body of the POST.

We are currently working on getting a more comprehensive set of 
documents on freebase describing the services available to developers. 
It should be up in the Freebase help section shortly.

Thanks.
AM

Coral Link wrote:
> Hello FreeBDevs:
> 
> So we finally got over the hump here; we fired up 'tcpflow' (awesome network
> diagnostic tool, by the way, easier than tcpdump) to monitor the exchange
> between the local system and freebase.
> 
> -The Broken-
> Freebase's 'raw' upload url (sandbox.freebase.com/api/service/upload) only
> accepts 'POST' requests but doesn't know how to deal with
> multipart/form-data as a content type.  PHP/libcurl defaults its POST to
> Content-Type: multipart/form-data,  and embeds the image inside of that
> multipart envelope.  Below is the tcpflow output with the broken code, minus
> some extraneous stuff (192.168.0.150 is the local system, 208.068.108.121 is
> sandbox.freebase.com):
> 
> 192.168.000.150.46220-208.068.108.121.00080: POST /api/service/upload
> HTTP/1.1
> Content-Type: image/gif
> Content-Length: 13365
> Content-Length: 13555
> Expect: 100-continue
> 
> 192.168.000.150.46220-208.068.108.121.00080: Content-Type:
> multipart/form-data; boundary=----------------------------b8245f93a0cb
> ------------------------------b8245f93a0cb
> Content-Disposition: form-data; name="filename"; filename="CORAL.gif"
> Content-Type: image/gif
> 
> 
> 192.168.000.150.46220-208.068.108.121.00080:
> GIF89a+.........).X.T.r....-.w.\.r....1{..d>3o;..5wV.l~3..,g.....;<Image
> Data Here>
> 192.168.000.150.46220-208.068.108.121.00080:
> ------------------------------b8245f93a0cb--
> 
> 208.068.108.121.00080-192.168.000.150.46220: HTTP/1.0 400 Bad Request
> 
> 
> ***This lead to the cryptic "cannot identify image file" response from the
> freebase server.***
> 
> 
> -The Fix-
> Straightforward, but there are no examples of this I could find in Google to
> use CURLOPT_READDATA instead of CURLOPT_POSTFIELDS:
> 
> Replace one line:
>    curl_setopt($request, CURLOPT_POSTFIELDS,$content);
> 
> With these two lines, dropping the @ from the front of the file name:
>     $fp = fopen ($content, "r");
>     curl_setopt($request, CURLOPT_READDATA, $fp);
> 
> 
> -The New-
> The working interaction is as follows, note there is no mention of
> multiparts:
> 
> 192.168.000.150.59161-208.068.108.121.00080: POST /api/service/upload
> HTTP/1.1
> Content-Type: image/gif
> Content-Length: 13365
> Expect: 100-continue
> 
> 
> 192.168.000.150.59161-208.068.108.121.00080: GIF89a+............,.<Image
> Data Here>
> \.r....1{..d>3o;..5wV.l~3..,g.....;
> 208.068.108.121.00080-192.168.000.150.59161: HTTP/1.0 200 OK
> 
> 
> Hope this leads to less pulled out hair for someone.
> 
> Regards,
> Indy
> 
> 
> On Dec 30, 2007 2:05 AM, Coral Link <corallink at gmail.com> wrote:
> 
>> Hi; I'm using PHP/LibCURL to upload images relevant to my topics.  I'm
>> guessing its more of a PHP issue than Freebase, but hopefully someone will
>> indulge a helping hand.
>>
>> I'm running into this problem when uploading an image:
>>
>> { "status": "400 Application Error", "code": "/api/status/error",
>> "messages": [ { "info": { "exception": "cannot identify image file" },
>> "message": "Invalid image file.", "code":
>> "/api/status/error/upload/invalid_image_data" } ] }
>>
>> When I run the following:
>>
>> $content="@/hole/www/corallink.com/freebase/files/uwlImage/9202a8c04000641f80000000060b61a7/CORAL.gif";
>> $type="image/gif";
>>
>> $request = curl_init($url);
>> curl_setopt($request, CURLOPT_COOKIEFILE, $cookiejarfile);  //get some
>> cookies
>> curl_setopt($request, CURLOPT_POST, 1);
>> curl_setopt($request, CURLOPT_HTTPHEADER, array("X-Metaweb-Request: TRUE",
>> "Content-Type: ".$type));
>> curl_setopt($request, CURLOPT_POSTFIELDS,$content);
>>
>> // Return the result instead of printing it out.
>> curl_setopt($request, CURLOPT_RETURNTRANSFER, TRUE);
>> curl_setopt($request, CURLOPT_COOKIE, $credentials);
>>
>> // Now fetch the URL
>> $responsetext = curl_exec($request);
>> curl_close($request);
>>
>>
>> This same code works great for uploading documents for the description in
>> /common/topic.  I've tried variations where I've made
>> $content=array("file"=>"@ filename.gif"), which uploaded data, but
>> Freebase tagged it as media_type 'octet/stream'.  Any suggestions will be
>> appreciated.
>>
>> Thank you and kind regards,
>> Indy
>>
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Developers mailing list
> Developers at freebase.com
> http://lists.freebase.com/mailman/listinfo/developers


More information about the Developers mailing list