Frankly, I think option three there is really the best one: "Send the metadata first, and return an ID to the client. The client then sends the file with the ID, and the server re-associates the file and the metadata."
JSON API File Upload question
Hi guys, I'm creating a JSON API with LR5.1. Everything is fine. The management asked me to implement a feature which allows users to upload files through my API. What is the best approach to implement user file uploads? I need to upload files and metadata with them. I googled for it and I really don't like the two phase upload idea here: http://stackoverflow.com/questions/4083702/posting-a-file-and-data-to-restful-webservice-as-json
- base64encode the file and send all the information as a json object
- Handle file upload as a regular form post.
How can I POST JSON data AND file if my application only accepts JSON requests?
My current my HTTP headers if someone wants to consume my API:
Content-Type: application/vnd.api+json
X-API-KEY: 1823764981763289716239476
Accept: application/vnd.api+json
I choosed the first option with LR5
my HTTP headers:
X-API-KEY: 5b81e6307ff218a6615d4ab78f2d3b51
Accept: application/vnd.api+json
Content-Type: application/json
And an example JSON body for the POST request:
{
"user_id": 10,
"uplolad_type": "profile_picture",
"file": "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"
}
And in the controller I can return the file key like this:
public function uploadFile(Request $request, User $user)
{
$file = base64_decode($request->get('file'));
return response()->json(['message' => "ok"]);
}
Please or to participate in this conversation.