TKoL
TKoL

Reputation: 13912

How to post an image to this web service

http://labelary.com/viewer.html

This webservice has an 'undocumented' service where you can post them a png, and then send you back the image encoded as a zpl file (for label printers). don't worry, I'm not trying to do anything they don't want me to do, it's mentioned at the bottom here that they allow this undocumented use of their api

So, when you use the api from within the web portal, it makes a post request to this url: http://api.labelary.com/v1/graphics

If I upload a png and then look in the Network tab of Chrome developer tools, I can see that it posted a Form Data, file: (binary)

In their documentation, they actually recommend this Ruby library: https://github.com/rjocoleman/labelary -- this has implemented into it a way to send the post request with the file up to that url and get the zpl data back.

If you navigate to labelary/lib/labelary/image.rb you can see the code for the encode function:

    def encode
      response = Labelary::Client.connection.post '/v1/graphics', { file: @file }, { Accept: 'application/json' }
      image = response.body

      return '^GFA,' + image['totalBytes'].to_s + ',' + image['totalBytes'].to_s + ',' + image['rowBytes'].to_s + ',' + image['data'] + '^FS'
    end

It makes that request using the faraday request library, if that's of any relevance.

So basically, I'm trying to implement this request in php+laravel using Guzzle. Now I know how to make a post request, but I don't exactly know how to send an image, and I searched around and came up with this code, which isn't working:

        $pngPath = storage_path('image.png'); // this is a confirmed real file on my system in the storage folder
        $client = new \GuzzleHttp\Client();
        $response = $client->request('POST', 'http://api.labelary.com/v1/graphics', [
            'headers' => [
                'Content-Type' => 'multipart/form-data'
            ],
            'multipart' => [
                [
                    'name'     => 'file',
                    'contents' => fopen($pngPath, 'r'),
                ]
            ]
        ]);

When I make that request, I get this error message that doesn't have much detail: ERROR: HTTP 400 Bad Request

Upvotes: 0

Views: 383

Answers (1)

TKoL
TKoL

Reputation: 13912

I just needed to modify a bit of my request and it worked -- I think it might have been the Content-Type header messing me up more than anything.

This is what the request looks like now:

            $client = new \GuzzleHttp\Client();
            $response = $client->request('POST', 'http://api.labelary.com/v1/graphics', [
                'headers' => [
                    // 'Content-Type' => 'multipart/form-data'
                    'Accept' => 'application/json'
                ],
                'multipart' => [
                    [
                        'Content-Type' => 'image/png',
                        'name'     => 'file',
                        'contents' => fopen($pngPath, 'r'),
                        'filename' => basename($pngPath)
                    ]
                ]
            ]);

Sorry for wasting everyone's time!

Upvotes: 1

Related Questions