Giter Club home page Giter Club logo

angular-base64-upload's Introduction

angular-base64-upload

Alt text

Converts files from file input into base64 encoded models. This directive is based from one of the answers in this SO question.

Requires angular version greater than or equal to 1.2.0. Tested on angular versions 1.2.0 through 1.3.15.

  <input type="file" ng-model="myfile" base-sixty-four-input>

$scope.myfile :

  {
    "filesize": 54836, /* bytes */
    "filetype": "image/jpeg",
    "filename": "profile.jpg",
    "base64":   "/9j/4AAQSkZJRgABAgAAAQABAAD//gAEKgD/4gIctcwIQA..."
  }

Installation

  • Bower - bower install angular-base64-upload
  • NPM - npm install angular-base64-upload

Example

See plunker.

Usage

Include angular.js and angular-base64-upload.js in your application and add naif.base64 as dependency to your main module.

angular.module('myApp', ['naif.base64']);
<form>
  <input type='file' ng-model='yourModel' base-sixty-four-input>
</form>

Multiple File Selection

Just add multiple attribute to the input element. yourModel will be an array of base64 file objects.

  <form>
    <input  type="file" ng-model="yourModel" multiple base-sixty-four-input>
  </form>

Validations

  • maxsize = Maximum file size in kilobytes (KB) (applied to all files when multi-select is enabled)
  • minsize = Minimum file size in kilobytes (KB) (applied to all files when multi-select is enabled)
  • maxnum = Maximum number of items to select (applicable only for multi-select)
  • minnum = Minimum number of items to select (applicable only for multi-select)
  • accept = Input file accept attribute. file_extension|audio/*|video/*|image/*|media_type comma separated
  • required = Checks if the model value is null, empty array [] or empty object {}
<form name="form">
  <input type="file" ng-model="files" name="files" multiple accept="image/*, .zip" maxsize="5000" required base-sixty-four-input>
  <span ng-show="form.files.$error.maxsize">Files must not exceed 5000 KB</span>
</form>

Options

  • do-not-parse-if-oversize = Prevents the image from being converted to base64 whenever its size exceeds the maximum file size; this can be useful to prevent the browser from freezing whenever an exceedingly large file is uploaded. If this flag is set, the base64 attribute in the model will be set to null whenever an oversized image is uploaded.

  • allow-same-file = boolean allow or disallow selecting same file

<form name="form">
  <input type="file" ng-model="files" name="files" base-sixty-four-input do-not-parse-if-oversize>
</form>

Custom Parser

You can implement your own parsing logic before the data gets added into the model.

Use case: You want images to be auto-resized after selecting files and add custom model attributes (Jimp has been used in the example below).

app.controller('ctrl', function ($scope, $q) {

  $scope.resizeImage = function ( file, base64_object ) {
    // file is an instance of File constructor.
    // base64_object is an object that contains compiled base64 image data from file.
    var deferred = $q.defer();
    var url = URL.createObjectURL(file);// creates url for file object.
    Jimp.read(url)
    .then(function (item) {
      item
      .resize(1280, Jimp.AUTO)// width of 1280px, auto-adjusted height
      .quality(50)//drops the image quality to 50%
      .getBase64(file.type, function (err, newBase64) {
        if (err) {throw err;}
        var bytes = Math.round((3/4)*newBase64.length);
        base64Object.filetype = file.type;
        base64Object.filesize = bytes;
        base64Object.base64 = newBase64;
        // Note that base64 in this package doesn't contain "data:image/jpeg;base64," part,
        // while base64 string from Jimp does. It should be taken care of in back-end side.
        deferred.resolve(base64Object);
      });
    })
    .catch(function (err) {
      return console.log(err);// error handling
    });
    return deferred.promise;
  };

});

<script src='/js/jimp.min.js'></script>
<input type="file" base-sixty-four-input ng-model="images" parser="resizeImage" multiple>

Params:

  • File - File object
  • Object - base64 encoded representation of file

Note: The parser handler can return a value or a promise. In case of a promise, it's resolved value will be appended to the model.

Events

FileReader Events - You can listen to all FileReader events by adding attributes to the input element using the format event_name="handler". Ex: onerror="errorHandlerFunc".

  • List of file reader event names:
    • onabort
    • onerror
    • onload
    • onloadstart
    • onloadend
    • onprogress
  • Params
    • EventObject - File reader event object depending on the event type. This can be an abort, error, load, loadstart, loadend, or progress event object.
    • FileReader - A File Reader instance used to read the file. Each file is read by respective file reader instance.
    • File - Current file being read by the file reader.
    • FileList - Array of selected files.
    • FileObjects - Array of base64 file objects that are done reading.
    • Object - Result of reading the file. In case of reading error, object.base64 might be undefined.

on-change - Unfortunately, Angular's ng-change directive doesn't work so well with input type file. This is the alternative way of binding to input's onchange event.

<input on-change="onChangeHandlerFunc">

  • Params:
    • Event - Event object.
    • FileList - Array of selected files.

on-after-validate - Ran after the validations are executed and after file object(s) are added to the model.

<input on-after-validate="onAfterValidateFunc">

  • Params:
    • Event - Event object.
    • FileObjects - Array of base64-encoded files.
    • FileList - Array of selected files.

Example event handler implementation:

$scope.errorHandler = function (event, reader, file, fileList, fileObjs, object) {
  console.log("An error occurred while reading file: "+file.name);
  reader.abort();
};

<form>
 <input type="file" base-sixty-four-input ng-model="myfile" onerror="errorHandler">
<form>

Clearing the input element

Just assign your model with null, {} or [] and it will automatically clear the input element

Server-Side

You will have to decode the base64 file in your backend by yourself.

Below is a ruby code for decoding the base64-encoded file to be passed to paperclip:

def create
  @resource.attachment = decode_base64
  # save resource and render response ...
end

def decode_base64
  # decode base64 string
  Rails.logger.info 'decoding base64 file'
  decoded_data = Base64.decode64(params[:your_model][:base64])
  # create 'file' understandable by Paperclip
  data = StringIO.new(decoded_data)
  data.class_eval do
    attr_accessor :content_type, :original_filename
  end

  # set file properties
  data.content_type = params[:your_model][:filetype]
  data.original_filename = params[:your_model][:filename]

  # return data to be used as the attachment file (paperclip)
  data
end

Contribution

  • Uses jasmine 1.3 in writing unit test specs
  • npm install -g gulp gulp-cli bower
  • npm install
  • bower install
  • gulp test to run unit tests
  • gulp build to build the project
  • Update README.md and CHANGELOG.md to reflect the new changes
  • Update the version number of package.json and bower.json

Change Log

See CHANGELOG.md

Author

Adones Pitogo

Contributors

See contributors list

License

Released under the terms of MIT License.

angular-base64-upload's People

Contributors

a13xg0 avatar adonespitogo avatar bikashdaga avatar bonya avatar boxfrommars avatar codenamezjames avatar craigcabrey avatar drola avatar gbrennon avatar marksyzm avatar metakermit avatar mmbfreitas avatar paneraallday avatar pegasuspect avatar seeebiii avatar stefanotorresi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

angular-base64-upload's Issues

Safari 5.1.7 issue

Hi guys,

When the page inits the following error comes up in the console.

The issue is spotted on Safari 5.1.7 which is default for Mac OS X version 10.7.5 (Lion) users.

Can't find variable: FileReader
https://192.168.1.215:4433/bower_components/angular-base64-upload/dist/angular-base64-upload.js:20 < input id="addressProof" type="file" ng-model="$parent.addressProof" base-sixty-four-input="" valid-file="" required="" accept="image/png,image/jpg, image/jpeg, application/pdf" ng-change="addressFileCheck();formChanged(4)" class="ng-pristine ng-untouched ng-valid" >

Asp.Net webapi

I'm sorry to bother with this, but can anyone share an example of how to handle the post using asp.net webapi?

Trigger click from other element

Hi guys,

Is possible create a trigger to click from other element to open the dialog? Add one example in the Readme 👍

Regards, Nicholls

Image orientation bug

hi! I upload image with verical orientation it convert into horizontal (90deg left). Is it real to upload in that orientation what it has.

Can't pass form validation

Hi,

I can't pass the form validation $scope.myForm.$valid with base-sixty-four-input input.
I have complain that field is not valid which makes my form invalid.

Any idea how to fix this?

Thanks.

Model not updating in controller

I have an issue where in my view i have

<input type="file" ng-model="attachment" class="ion-paperclip text-right float-right attachment" base-sixty-four-input onerror="errorHandler" onchange="fileChanged"/>

For one I have fileChanged defined in the controller and everytime I add a file that function comes up as undefined.

For two I have a div with {{attachment}} this is showing up correctly for when I add the file, but when I go to use that file in another function $scope.attachment, it's coming up as undefined.

Any help would be appreciated.

Sean

Size and Format validation?

I'm working on a file type and size validation routine that is perfomed prior to base64 conversion (I used to validate it after the ngModel was updated untill I tested a big file and it crashed my browser. Also, there's no point in performing the whole thing if it's just gonna get ditched in the end because the file is too big, for example).

Right now there are new optional attributes (max size, accepted formats and response) that handle those. The response is a string returned to the controller with the proper event description (maxSizeExceeded, invalidFormat and success - which resolves #20 I believe).

It's pretty much finished, just running some tests to be sure it's all ok (100% compatibility with how it's implemented right now). Would this be something you'd like to incorporate? Or you want it to be as simple as possible (added about 25 lines of code or so)?

Add a Data URI scheme format

To be able to use the image in a roundtrip back on the UI in Angular, we need to write something like:

<img data-ng-src="{{picture.dataURI}}"/>

where dataURI needs to be the Data URI scheme for the browser to render the image properly:

picture.dataURI = "data:image/" + picture.filetype + ";base64," + picture.base64;

Having to manually type this out is a bit tiresome and it would be cool if there was e.g. a method like picture.dataURI() that we could call. It could maybe be added to the fileObject or as some sort of service. What do you think? I could try to prepare a pull request if you're interested.

Safari 5.1.7 issue

Hi guys,

When the page inits the following error comes up in the console.

The issue is spotted on Safari 5.1.7 which is default for Mac OS X version 10.7.5 (Lion) users.

Can't find variable: FileReader
https://192.168.1.215:4433/bower_components/angular-base64-upload/dist/angular-base64-upload.js:20 < input id="addressProof" type="file" ng-model="$parent.addressProof" base-sixty-four-input="" valid-file="" required="" accept="image/png,image/jpg, image/jpeg, application/pdf" ng-change="addressFileCheck();formChanged(4)" class="ng-pristine ng-untouched ng-valid" >

"accept" is always case sensitive

I have configured the my upload field to accept MS Word files:
<input type="file" name="file" ng-model="vm.file" base-sixty-four-input accept=".doc, .docx">
Unfortunately that prevents upload files with upper case characters in the extension like some.DOC or another.Doc.
(For some reason our users have lots of word documents with .DOC suffix.)

Ideas:

  • Generally make the "accept" value case insensitive
  • Add an option to make the "accept" value case insensitive
  • Accept regexp objects in the "accept" parameter (or add a new parameter like "accept-regexp")

Feature Request

Hello,

I would love to see an example (or support for) with compression of an image as part of the encoding process, so that might be the ability to set a maximum height/width for an image, or a ratio to reduce the "physical" dimensions by.

I feel this is going to be a common use case, so just wanted to pitch the idea!

Thanks for the library.

Maximum file size

Is there a maximum file size? When I try and upload a file of 35MB, the browser crashes. I've narrowed it down to this code:
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
Is this control capable of handling large files of these sizes?

Parent form set to $dirty initially

Hi guys,

I using [email protected] with [email protected]. I have a form similar to the one below:

<ng-form name="editForm" role="form" form-confirm>
<div class="form-group col-xs-2">
                                            <div class="input-group">
                                                <div class="control-label">{{document.documentFile.filename}}</div>
                                                <span class="file-upload">
                                                    <span class="nav-link" translate>DOCUMENT.ATTACH</span>
                                                <input class="upload" name="documentFile" type="file" ng-model="document.documentFile" base-sixty-four-input>
                                                </span>
                                            </div>
                                        </div>
</ng-form>


My form is initially flagged as dirty although the input itself is not. The flag is removed as soon as i remove the base-sixty-four-input or the ng-model from the input element, i.e., the base-sixty-four-input seems the change the model, any ideas on what's happening ?

Cannot read property '0' of undefined

In RegisterController.js

function saveUpdatedProfile() {

var editProfile={

            "profileDetails":{
                "firstName":$scope.firstName,
                "lastName":$scope.lastName,
                "dob"      :$scope.dob,
                "eMailId":$scope.eMailId,

                  "ImageProofContent":$scope.imageProof[0].base64,
                 "ImageProofType":$scope.imageProof[0].filetype,

}

I want the form to allow without selecting imageProof , form can be submiited without the imageproof .

Working fine when i select a file , getting this is error when i am not selecting any file.
i have to send base64 and fileType to the server.

Clearing the file that is already loaded

Hi, is there a way to clear a file that is already loaded in the 'input' ? I tried setting the model to null, but it didn't clear away the file. Would be nice if there's an on-demand function to call and reset the file uploader. Thanks!

Resize Image

It would be nice to have an attribute for resizing an image, instead of having to write a parser yourself. Because after 2h of trying I still can't get my own parser to work. I am trying it to do with the canvas trick, but I think canvas.toDataURL(fileType) as resized isn't accepted by var modelVal = {file:file, resized: resized}.

Clearing the input element

Hi dudes!
I have trouble with attaching file twice

  .img.avatar
    / show img if file selected
    %img{'ng-src' => "data:{{user.new_avatar.filetype}};base64,{{user.new_avatar.base64}}", width: '128px', height: '128px', 'ng-if' => 'user.new_avatar'}

    / avatar input
    %input{'ng-model' => 'user.new_avatar',:accept => "image/jpeg,image/png,image/gif", :autocomplete => "off", :name => "img", :style => "cursor:pointer;", :type => "file"}(base-sixty-four-input)
  .add-file.blockLeft
    %input#avatar_browser{:accept => "image/jpeg,image/png,image/gif", :autocomplete => "off", :name => "img", :style => "cursor:pointer;", :type => "file", 'ng-model' => 'user.new_avatar'}(base-sixty-four-input)

/ Delete (clearing the input) avatar file
%p.blockLeft.file{'ng-if' => 'user.new_avatar'}
  %a{'ng-click' => 'user.new_avatar = null'}
  %span {{user.new_avatar.filename}}

If i chose file , then clear file handle and choose the same file angular-base64-upload do not attach againt file to ng-model

The Demo needs to be updated

I forgot to update the demo. it still says
<input type="file" ng-file="resource.image" name="file" base-sixty-four-input>

Cannot read property '0' of undefined

In RegisterController.js

function saveUpdatedProfile() {

var editProfile={

            "profileDetails":{
                "firstName":$scope.firstName,
                "lastName":$scope.lastName,
                "dob"      :$scope.dob,
                "eMailId":$scope.eMailId,

                  "ImageProofContent":$scope.imageProof[0].base64,
                 "ImageProofType":$scope.imageProof[0].filetype,

}

                           <input type="file" ng-model="imageProof" name="imageProof"  accept="image/jpg, zip" maxsize="5000" required base-sixty-four-input>
                           <img ng-show="form.imageProof.$valid" ngf-thumbnail="imageProof" class="thumb">
                          <span ng-show="form.imageProof.$dirty && form.imageProof.$error.required" class="help-block">Files must not exceed 5000 KB</span>
                        
                           <span ng-show="form.imageProof.$error.maxSize" class="help-block">File too large: max 1M</span>

i want the form to allow without selecting imageProof , form can be submiited without the imageproof .

Working fine when i select a file , getting this is when i am not selecting any file.
i have to send base64 and fileType to the server.

maxsize issue

I am using this plugin in my project, however, it seems that sometimes it works, but sometimes it doesn't work fine even though it is the same file.
in .html:

"input id="file" class="upload-file" type="file" ng-model="file" name="file" base-sixty-four-input onload="onload" maxsize="10" accept="image/*""

in controller .js:

$scope.onload = function (e, reader, file, fileList, fileOjects, fileObj) {
if ($scope.photoForm.$invalid) {
if ($scope.photoForm.file.$error.maxsize) {
...

For example, i tried to upload the same file with size 14k, sometimes it passed the maxsize validation, but sometimes it didn't. Have no idea for it.

Appreciate for any help.

Thanks!

How to detect when image uploaded?

First of all, great module! Neat and simple!

I tried using $watch, but eventually I get

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

Is there an efficient way to detect when an image was uploaded to the uploader?

onloadend event

is there possible send own param to onloadend event ?

%input.hidden_input{:type => "file", 'ng-model' => "record.attach", "onloadend" => "vm.attach_loaded"}(base-sixty-four-input)

controller:

  attach_loaded: (event_object, file_reader, file, file_list, file_objects, object) ->
    console.log @ # <-- want here my controller object but got Window {external: Objec

NoMethodError (undefined method `[]' for nil:NilClass)

I am getting an undefined method '[]' for nil:NilClass when I try to upload an image. Not really sure what is going on. It seems to be working as intended, but the image won't take once it hits my controller.

Any ideas why? I am pretty new to Ruby on Rails/AngularJS so it might just be a simple error I am overlooking.

def decode_base64
      Rails.logger.info 'decoding base64 file'
      decoded_data = Base64.decode64(params[:image][:base64])
      data = StringIO.new(decoded_data)
      data.class_eval do
        attr_accessor :content_type, :original_filename
      end

      data.content_type = params[:image][:filetype]
      data.original_filename = params[:image][:filename]

      data
    end
def create
    @post = Post.new(post_params)
    @post.attachment = decode_base64
    @post.status = 'open'

    if @post.save
      render json: @post, status: :created, location: @post
    else
      render json: @post.errors.full_messages, status: :unprocessable_entity
    end
  end

Not working on IE9

Hi,

Thx for this, this is a cool feature, but unfortunately, it does not work on IE9 because of FileReader API...
Is there a way to make it work on IE9 ?

Thx !

Great works but problem with PHP

When I crop the image i put a button to upload with ng-click='uploadFile()' and in the controller i make this changes:

$scope.uploadFile = function(){
//$scope.myCroppedImage is the name of img src

$http.post('/public/up64.php', $scope.myCroppedImage)
.success(function(res){
alert('View file '+res+' ?');
$window.location.assign(res);
})
}

But I receive error from PHP!

fopen(): Filename cannot be empty in .....on line 18
fwrite() expects parameter 1 to be resource, boolean given in ....line 19
fclose() expects parameter 1 to be resource, boolean given in....line 20

I've to make changes on php files?!

Uncaught Exception with oversized files

I get an exception RangeError: Invalid string length on the line

var base64 = btoa(e.target.result);

During testing I uploaded a PSD file which is over 400MB—obviously this is a ridiculous and largely unrealistic size of file but could we handle the error?

$http Upload

Hi all,
Using this directive, I can see how it outputs to base64, but am confused on how to pass this into my $http post as it is currently uploading a "corrupted" image file via SharePoint's REST API.
HTML:

<form>
<input type="file" data-ng-model="files" base-sixty-four-input>
<button data-ng-click="upload()">Submit</button>
</form>

Upload Function:

$scope.upload = function () {
        console.log($scope.files);
                        $http.post("/sites/ens/_api/web/lists/getByTitle('Report Images')/RootFolder/Files/add(url='" + $scope.files.filename + "',overwrite='true')", $scope.files.base64,
                    {
                        headers: {
                            'X-RequestDigest': $("#__REQUESTDIGEST").val(),
                        }

                }).success(function (d) {
                    console.log(d);
                });
            }

$scope.file non initialized

hi,

i've implemented your solution base64 and it's pretty good on the view side...But, when i try to use $scope.file, it is undefined...Any suggestion?

view side

<code><form>
  <input type='file' ng-model='creativefile' base-sixty-four-input>
  <button ng-click='upload_file()'>Upload</button>
creativefile :{{creativefile.filesize}}
filesize apres click: {{filesize}}
</form>
</code>


/*js side in my controller*/

scope.creativefile={};

        $scope.upload_file = function(){
          $scope.filesize=$scope.creativefile.filename;
        }


any suggestion?

Doesn't work inside ng-repeat

When base-sixty-four-input is used inside ng-repeat and model value is predefined then model is set to null. Here is code snippet:

<div ng-repeat="obj in licenses">
  <label>
     <img ng-src="data:image/png;base64,{{obj.base64}}"
     <input type="file" ng-model="obj" style="display:none" base-sixty-four-input>
  </label>
</div>

IE (11 or 10, client didn't say) getting "Object doesn't support property or method 'readAsBinaryString"

I suspect this is related to a similar issue on another project, at aadsm/JavaScript-ID3-Reader#13 which has some good reading. It sounds like readAsBinaryString is deprecated, so readAsArrayBuffer is better.

bower_components/angular-base64-upload/dist/angular-base64-upload.js: reader.readAsBinaryString(file);
bower_components/angular-base64-upload/dist/angular-base64-upload.min.js:angular.module("naif.base64",[]).directive("baseSixtyFourInput",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){var e={};a.readerOnload=function(b){var c=btoa(b.target.result);e.base64=c,a.$apply(function(){d.$setViewValue(e)})};var f=new FileReader;f.onload=a.readerOnload,b.on("change",function(){var a=b[0].files[0];e.filetype=a.type,e.filename=a.name,f.readAsBinaryString(a)})}}});
bower_components/angular-base64-upload/src/angular-base64-upload.js: reader.readAsBinaryString(file);

Any chance that can be swapped for readAsArrayBuffer to get IE compatibility?

Thanks!
Chris

No Filetype in Android

I'm building an app with Ionic and using angular-base64-upload to save images to my remote server. On iOS, the filetype is being found fine, but on Android, the filetype is left blank. On both the base64 works fine.

Edit:
Alternatively, I'm currently just getting the mime type in on the server-side, by decoding the base64 and using PHP's FileInfo function.

not working

I installed and configure the pluguin correctly but seems it doesn't work. I use AngularJS v1.5.8 .
Can anybody say me if it works at this version?

Update?

Hello,

Versions above 0.0.6 break for me when I try to use it with npm install and then browserify the code client side, so I feel there may have been a regression somewhere?

Can i get the image dimensions too ?

i wanna add validations on image resolution and my backend accepts base64 encoded image data, is it possible to get image dimensions so i can validate before pushing to server?

Reset input

Hi.. how is the way to reset the input file after upload ? or reset form ???

MongoDB Model for this module

Hi, what is the right schema atribute to sabe this in MongoDB ?

I'm trying to use with this one

var projectSchema = mongoose.Schema({

name: {
    type: String,
    required: true
},
room: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Room'
},
members: {
    type: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }]
},
managers: {
    type: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }]
},
image: {
  data: Buffer
}

});

But I can get it to work with "data:buffer"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.