Skip to content

Instantly share code, notes, and snippets.

@rafaelmartins
Last active August 29, 2015 14:27
Show Gist options
  • Save rafaelmartins/b3838a7f2afeb3df5dac to your computer and use it in GitHub Desktop.
Save rafaelmartins/b3838a7f2afeb3df5dac to your computer and use it in GitHub Desktop.

Revisions

  1. rafaelmartins revised this gist Aug 21, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion upload.c
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    /*
    * This is a simple (and naive) example of image upload using balde. It saves
    * the image in a temporary directory with the md5 checksum as the file name.
    * the image in a temporary directory with the SHA1 checksum as the file name.
    * Also, it supports only JPEG files, and the validation is very weak. It's
    * just an usage example. :)
    *
  2. rafaelmartins created this gist Aug 21, 2015.
    121 changes: 121 additions & 0 deletions upload.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,121 @@
    /*
    * This is a simple (and naive) example of image upload using balde. It saves
    * the image in a temporary directory with the md5 checksum as the file name.
    * Also, it supports only JPEG files, and the validation is very weak. It's
    * just an usage example. :)
    *
    * After uploading the image, the client will be redirected to a page with
    * the image, from the 'picture' endpoint, that shows the last uploaded iamge.
    *
    * To build it:
    * $ gcc -o upload upload.c $(pkg-config --libs --cflags balde)
    *
    * To run it:
    * $ ./upload -s
    *
    * License: LGPL-2.1 (http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)
    */

    #include <balde.h>


    balde_response_t*
    main_view(balde_app_t *app, balde_request_t *request)
    {
    balde_session_open(app, request);
    balde_response_t *response = balde_make_response(
    "<html>\n<body>\n<h1>Upload your picture</h1>\n");
    gchar *tmp, *url;
    if (balde_session_get(request, "picture")) {
    url = balde_app_url_for(app, request, "picture", FALSE);
    tmp = g_strdup_printf(
    "<h2>Current picture</h2>\n<img src=\"%s\" />\n<hr />\n", url);
    g_free(url);
    balde_response_append_body(response, tmp);
    g_free(tmp);
    }
    url = balde_app_url_for(app, request, "upload", FALSE);
    tmp = g_strdup_printf(
    "<form action=\"%s\" method=\"POST\" enctype=\"multipart/form-data\">\n"
    " <input type=\"file\" name=\"picture\" />\n"
    " <input type=\"submit\" />\n"
    "</form>\n", url);
    g_free(url);
    balde_response_append_body(response, tmp);
    g_free(tmp);
    balde_session_save(request, response);
    return response;
    }


    balde_response_t*
    upload_view(balde_app_t *app, balde_request_t *request)
    {
    balde_session_open(app, request);
    balde_response_t *response = NULL;
    const balde_file_t *file = balde_request_get_file(request, "picture");
    if (file == NULL) {
    response = balde_abort(app, 404);
    goto clean;
    }
    if (g_strcmp0(file->type, "image/jpeg") != 0) {
    response = balde_abort(app, 403);
    goto clean;
    }
    gchar *hash = g_compute_checksum_for_string(G_CHECKSUM_SHA1,
    file->content->str, file->content->len);
    gchar *filename = g_strdup_printf("%s.jpg", hash);
    g_free(hash);
    gchar *filepath = balde_file_save_to_disk(file, g_get_tmp_dir(), filename);
    g_free(filename);
    balde_session_set(request, "picture", filepath);
    g_free(filepath);
    response = balde_abort(app, 301);
    gchar *url = balde_app_url_for(app, request, "main", FALSE);
    balde_response_set_header(response, "location", url);
    g_free(url);
    clean:
    balde_session_save(request, response);
    return response;
    }


    balde_response_t*
    picture_view(balde_app_t *app, balde_request_t *request)
    {
    balde_session_open(app, request);
    balde_response_t *response = NULL;
    const gchar *filepath = balde_session_get(request, "picture");
    if (filepath == NULL) {
    response = balde_abort(app, 404);
    goto clean;
    }
    gchar *contents;
    gsize len;
    if (!g_file_get_contents(filepath, &contents, &len, NULL)) {
    response = balde_abort(app, 404);
    goto clean;
    }
    response = balde_make_response_len(contents, len);
    g_free(contents);
    balde_response_set_header(response, "content-type", "image/jpeg");
    clean:
    balde_session_save(request, response);
    return response;
    }


    int
    main(int argc, char **argv)
    {
    balde_app_t *app = balde_app_init();
    balde_app_set_config(app, "SECRET_KEY", "bola");
    balde_app_add_url_rule(app, "main", "/", BALDE_HTTP_GET, main_view);
    balde_app_add_url_rule(app, "upload", "/upload/", BALDE_HTTP_POST,
    upload_view);
    balde_app_add_url_rule(app, "picture", "/picture/", BALDE_HTTP_GET,
    picture_view);
    balde_app_run(app, argc, argv);
    balde_app_free(app);
    return 0;
    }