Home

Flask sqlalchemy store image

I'm working on a blog-like application with Flask and SQLAlchemy and I'm unsure how to store the blog posts (articles) in the database. These are going to contain text and images (placed between paragraphaphs). I expect the text to have formatting, with bold, italic, different font sizes, etc. Would markup be a good option I am trying to build a webpage with a Project class and Project class will have multiple image files. I can upload and store the image files but can't insert the file paths of images to database. So i can call the image paths from db. I have a sqlite db and i use Flask-SQLAlchemy. Here is my Project Class. I've messed up a bit 2.) this is my python file code where i intend to allow uploading of images as BLOB into room_image (within newRoom function is where the upload for a photo image is to take place and stored in room_image Column in my room table) Create two additional methods in this case photo_img and photo_img_thumbnail, to inject your own custom HTML, to show your saved images.In this example the customized method is showing the images, and linking them with the show view. Notice how the methods are calling get_url and get_url_thumbnail from ImageManager, these are returning the url for the images, each image is saved on the. Attaching Images ¶ You've declared SQLAlchemy-ImageAttach exposes underlayer functions like push_store_context() and pop_store_context() that are used for implementing store_context(). For example, use before_request() and teardown_request() if you are using Flask

How to store articles (with text and images) in SQLAlchemy

  1. Library that works with Flask & SqlAlchemy to store files in your database and server. Navigation. Project description Release history Download files # A common scenario could be a video with placeholder image. # So first lets grab the files from Flask's request object: my_video = request. files [my_video] placeholder_img = request. files.
  2. Image used in this application for uploading and displaying: Deploying the Application Now navigate to the project's root directory using command line tool and execute the command python main.py or if your Python is on the classpath then just execute main.py , your server will be started on default port 5000
  3. Note: We inserted employee id, name, photo, and bio-data file.For image and bio-data, we passed the location where it is present. As you can see, we converted our image and file into a binary format by reading the image and file in the rb mode before inserting it into a BLOB column.. Also, we used a parameterized query to insert dynamic data into a MySQL table
  4. Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (2.x) Flask-SQLAlchemy is an extension for Flask that adds support for SQLAlchemy to your application. It aims to simplify using SQLAlchemy with Flask by providing useful defaults and extra helpers that make it easier to accomplish common tasks
  5. SQLAlchemy-ImageAttach¶. SQLAlchemy-ImageAttach is a SQLAlchemy extension for attaching images to entity objects. It provides the following features: Storage backend interface You can use file system backend on your local development box, and switch it to AWS S3 when it's deployed to the production box. Or you can add a new backend implementation by yourself
  6. Generic Types¶. Generic types specify a column that can read, write and store a particular type of Python data. SQLAlchemy will choose the best database column type available on the target database when issuing a CREATE TABLE statement. For complete control over which column type is emitted in CREATE TABLE, such as VARCHAR see SQL Standard and Multiple Vendor Types and the other sections of.
  7. In this post, I want to write about how to build a simple image processing web API that returns the size of an image. The topics include how to build this web API with Flask and how to post image to this web API and get response. There are mainly two ways by which we can send an image to the web service. Based on how you send the image, the way.

Column, Integer, String, Model and other SQLAlchemy classes are all available via the db object constructed from Flask-SQLAlchemy. We have defined a model to store the current state of our spacecraft's engines. Each engine has an id, a title and a thrust level. We still need to add some database information to our configuration Manage Database Models with Flask-SQLAlchemy. Former product manager turned data engineer with ongoing identity crisis. Breaks everything before learning concepts known as 'best practices'. Completely normal and emotionally stable. By now you're surely familiar with the benefits of Python's core SQLAlchemy library: the all-in-one solution. Using raw SQL in Flask web applications to perform CRUD operations on database can be tedious. Instead, SQLAlchemy, a Python toolkit is a powerful OR Mapper that gives application developers the full power and flexibility of SQL. Flask-SQLAlchemy is the Flask extension that adds support for SQLAlchemy to your Flask application Flask SQLAlchemy (with Examples) Using raw SQL in the Flask Web application to perform CRUD operations on the database can be cumbersome. Instead, SQLAlchemy, the Python Toolkit is a powerful OR Mapper, which provides application developers with the full functionality and flexibility of SQL Uploading files in Flask to a database is very simple to accomplish. In this video, I'll show you to use an HTML upload form to upload files to Flask and sav..

Save image file name. A different method to upload and store a file is to store the image in a folder on the server and save the path to that image in a text column in Postgres. A benefit with that method is increased portability because the blob datatype works differently in different database systems and is not even available in some Quickstart¶. Flask-SQLAlchemy is fun to use, incredibly easy for basic applications, and readily extends for larger applications. For the complete guide, checkout the API documentation on the SQLAlchemy class

Inheritance in SQLAlchemy (with Flask) SQLAlchemy is an Object-relational mapping (ORM) made for the Python programming language. ORMs in theory allow programmers to abstract away SQL. In simple terms they allow us to interact with a database using purely Python (objects/functions). I will be using the flask-SQLAlchemy extension for my examples Configuring Flask-SQLAlchemy. Because we installed SQLAlchemy and the Flask extension Flask-SQLAlchemy at the start of this tutorial, we can go straight into using them now. We need to set up a database, open a connection to it, and associate this connection with our web application

Flask Database Integration with SQLAlchemy. Databases are integral components of building web applications. Throughout the life-cycle of a web application, the user sends bits of data that are needed to be stored for future reference. Simultaneously, the user also requests information from where they are stored 4. The data model. We store the image information in an SQL database. Therefore, we use Flask-SQLAlchemy, a library that helps using Flask with SQLAlchemy — which again is a Flask SQL toolkit that gives you the possibility to use SQL with Flask.. 3.1. Getting started with SQL for Flask. The package supporting SQL databases is flask-sqlalchemy, version 2.4.4 is in the requiremets.txt file static - contains static files i.e. CSS, Javascript, images templates - this is where you store your html templates i.e. index.html, layout.html requirements.txt - this is where you store your package dependancies, you can use pip yourappenv - your virtual environment for development . Solution 3 (Image by author) Flask names an app 'application' by default, so you'd need an application.py file for the app to run. You can change the name of your app if you want to (using $ export FLASK_APP = 'your file name'.py). I like putting all Flask related code into a subdirectory called app instead of the root.. My application.py looks like:. from app import applicatio For uploads to Cloudinary, the default resource_type is image.To expand or create a new Flask API, add resource_type: 'video' or resource_type: 'raw' for video or raw files, respectively.Raw refers to nonmedia file formats, including text and JSON.. Finally, upload_result is an object that contains the upload response. To complete the actions of your upload API, return that response to the.

How to store multiple image filepaths in flask sqlachemy

This is the first of three posts about building JSON APIs with Flask. Part 2 and part 3 arrive tomorrow and the day after.. I've seen a lot of questions on StackOverflow about how to turn SQLAlchemy models into JSON. When building a JSON API with Flask and SQLAlchemy, you end up writing a lot of boilerplate api code just to serialize your models into JSON.. Since I encountered this problem. The above command will create a virtual environment for our project and also install flask and flask-sqlalchemy. Note-For those of you who aren't aware of flask-sqlalchemy, in simple terms, flask-sqlalchemy provides us support to perform CRUD operations on the database without having to write raw SQL statements.To activate the virtual environment, all you have to do is to run the following. Upload image. Templates. Personal Moderator. Create template Templates let you quickly answer FAQs or store snippets for re-use. Submit Working with PostgreSQL and flask_sqlalchemy # flask # python # sqlalchemy # postgres. Build a Flask Application with Blueprint The easiest way to call a stored procedure in MySQL using SQLAlchemy is by using callproc method of Engine.raw_connection().call_proc will require the procedure name and parameters required for the stored procedure being called.. def call_procedure(function_name, params): connection = cloudsql.Engine.raw_connection() try: cursor = connection.cursor() cursor.callproc(function_name, params.

Flip~ JB ! : [Flask] ORM with Flask-SQLAlchemy and Flask

Python. sqlalchemy.LargeBinary () Examples. The following are 30 code examples for showing how to use sqlalchemy.LargeBinary () . These examples are extracted from open source projects. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example Delete files. Deleting files from the db & server can be non trivial, especially to keep both in sync. The file_upload.delete_files method can be called with a kwarg of clean_up & then depending of the string value passed it will provide 2 types of clean up functionality:. files will clean up files on the server but not update the model; model will update the model but not attempt to remove. The type column says that it was an ALL type query and it means that MySQL was unable to identify any keys that can be used. So if we set a proper index the query should run faster. Flask-DebugToolbar. More high-level tools can profile Flask. One of them is a flask-debugtoolbar.It's simple to install with pip install flask-debugtoolbar.. from flask_debugtoolbar import DebugToolbarExtension.

sqlite: Python (flask) BLOB image, SQLite, Sqlalchemy

Flask-SQLAlchemy is an extension for Flask that adds support for SQLAlchemy to your application. It aims to simplify using SQLAlchemy with Flask by providing useful defaults and extra helpers that make it easier to accomplish common tasks. flask sqlalchemy flask-sqlalchemy Library that works with Flask & SqlAlchemy to store files in your database and server. - 0.1.5 - a Python package on PyPI - Libraries.i Quick Note: The following article is explained irrespective of your codebase, as to deploy a Flask Application with a Database on Heroku all we have to modify is the app.config['SQLALCHEMY. Flask Admin is a great way to update your database in areas where the user wouldn't be directly involved. So instead of manipulating the database from your d..

Model Views with Files and Images — Flask AppBuilde

Attaching Images — SQLAlchemy-ImageAttach 0

SQLAlchemy and Flask-SQLAlchemy # SQLAlchemy is the de facto framework for working with relational databases in Python. It was created by Mike Bayer in 2005. SQLAlchemy supports databases like MySQL, PostgreSQL, Oracle, MS-SQL, SQLite and so on So first we need a couple of imports. Most should be straightforward, the werkzeug.secure_filename() is explained a little bit later. The UPLOAD_FOLDER is where we will store the uploaded files and the ALLOWED_EXTENSIONS is the set of allowed file extensions. Why do we limit the extensions that are allowed? You probably don't want your users to be able to upload everything there if the. To use MySQL as database backend, when we use Flask-SQLAlchemy, we need only to update one configuration concerning the database in the config.py. SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'. As per the given connection string, the name of the database is myapp. The user to connect with the database is myapp@localhost Dockerizing Flask with Postgres, Gunicorn, and Nginx. This is a step-by-step tutorial that details how to configure Flask to run on Docker with Postgres. For production environments, we'll add on Nginx and Gunicorn. We'll also take a look at how to serve static and user-uploaded media files via Nginx. Dependencies Now that we know what pieces of data are critical to store, let's set up Flask-SQLAlchemy (the ORM library we'll use to manage the database) as well as our database model. Initialize Flask-SQLAlchemy. To get our database hooked up, the first step is getting Flask-SQLAlchemy working. Create a new file, blog/db.py and copy in the following.

flask-file-upload · PyP

Usage like redis_store['key'] = value, redis_store['key'], and del redis_store['key'] is now supported. Thanks, @ariscn! 0.2.0 (2015-04-15) Made 0.1.0's deprecation warned changes final; 0.1.0 (2015-04-15) Deprecation: Renamed flask_redis.Redis to flask_redis.FlaskRedis. Using the old name still works, but emits a deprecation warning, as it. This article presents a shortlist with useful hints and features that might help developers code faster a Flask project. For newcomers, Flask is a lightweight WSGI web application framework designed to get started quickly and easily, with the ability to scale up to complex applications. #1 - How to code a super simple App in Flask #2 - How to structure your projec The Flask Mega-Tutorial Part XVI: Full-Text Search. Posted by Miguel Grinberg under Python, Flask, Programming, Database. This is the sixteenth installment of the Flask Mega-Tutorial series, in which I'm going to add a full-text search capability to Microblog. For your reference, below is a list of the articles in this series Creating an API or Web application using python has been made easy with Flask. It is a micro web framework written in Python. Here you will create a python server using Flask, create database wit Flask - SQLite. Python has an in-built support for SQlite. SQlite3 module is shipped with Python distribution. For a detailed tutorial on using SQLite database in Python, please refer to this link. In this section we shall see how a Flask application interacts with SQLite. Create an SQLite database 'database.db' and create a students.

Upload and display image using Python Flask - Roy Tutorial

Flask and Databases¶. To add database functionality to a Flask app, we will use SQLAlchemy. SQLAlchemy is a Python SQL toolkit and object relational mapper (ORM) that enables Python to communicate with the SQL database system you prefer: MySQL, PostgreSQL, SQLite, and others. An ORM converts data between incompatible systems (object structure in Python, table structure in SQL database) Flask DB. Go ahead and create a table in the DB. Enter the table name in the space given as shown in the picture and hit Go. 3. Installing Flask- MySQL library in our system. Flask uses flask_mysqldb connector to use MySQL. Run the following command to install the package: pip install flask_mysqldb. Perfect !

Flask-SQLAlchemy is a Flask extension library that we will use to add SQLAlchemy to the Flask project. SQLAlchemy is an Object Relational Mapper that provides access to SQL databases through Python objects. Prerequisites. Python 3.6 and above installed on your computer. Postman installed on your computer. Apache XAMPP installed on your computer Then we can update tracking.models to use from flask_tracking.data import db and tracking.views to use from flask_tracking.data import db, query_to_list and we should now have a working multi-package application.. Users. Now that we have split up our application into separate packages of related functionality, let's start working on the users package. Users need to be able to sign up for an. Before any Python code can talk to the webserver and the database, we have to create a new Flask object that will serve as our application and create a new SQLAlchemy object to define the ORM objects and access the ORM Session. The above code imports Flask and SQLAlchemy, then creates a new Flask object called app Flusk. Flusk is an example that you can use to create big Flask applications that include SQLAlchemy, Docker, and Nginx. It has a beautiful logic separation to create backend, domain, views, and models into their respective layers. It has excellent use of Flask Blueprints and follows the Factory design pattern

Python MySQL- Insert / Retrieve file and images as a Blob

The example shown below exhibits how to create a Python Flask web application and display SQL Server table records in a Web Browser. Steps First, we will create a Flask Web Python project. Open Visual Studio. Select File, New, and then Project. Now, select Python followed by Flask Web Project, enter a name to the project and choose the location. Basic fields¶. Basic fields generally represent scalar data types with single values, and refer to a single input from the form. class wtforms.fields.BooleanField (default field arguments, false_values=None) [source] ¶. Represents an <input type=checkbox>.Set the checked-status by using the default-option.Any value for default, e.g. default=checked puts checked into the html-element and. Flask-SQLAlchemy is a Flask extension that simplifies the use of SQLAlchemy inside Flask applications. We need to have a table called USERS in the database to store the details of the users. When referring to the persistent entities in the application the term model is used. The article cover image had been downloaded from Unsplash The application is developed using Flask, SQLAlchemy and PostgreSQL . Creation of Online Poll Application. One table is required to store the poll questions and the opinions expressed by visitors. The structure is as shown in the image

Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (2

After filling the form, the user data is sent to the server via the POST method. We will learn more about these two methods in a bit. These forms are displayed to the user through templates using the <form> attribute of HTML. The Sample HTML form looks like: <form action=action_to_perform_after_submission method = POST> Large Text/Binary Type Deprecation¶. Per SQL Server 2012/2014 Documentation, the NTEXT, TEXT and IMAGE datatypes are to be removed from SQL Server in a future release. SQLAlchemy normally relates these types to the UnicodeText, Text and LargeBinary datatypes. In order to accommodate this change, a new flag deprecate_large_types is added to the dialect, which will be automatically set based on. Flask-Potion is a powerful Flask extension for building RESTful JSON APIs. Potion features include validation, model resources and routes, relations, object permissions, filtering, sorting, pagination, signals, and automatic API schema generation. Potion ships with backends for SQLAlchemy, peewee and MongoEngine models Creating a Flask application in PyCharm. Create a basic Flask project as described in Creating a Flask Project to start prototyping the application. Select Flask in the New Project dialog. In the Location field, provide the path to the project location and type the MeteoMaster as the project name. Leave the rest of the settings default and.

Flask-Caching¶. Flask-Caching is an extension to Flask that adds caching support for various backends to any Flask application. Besides providing support for all werkzeug's original caching backends through a uniformed API, it is also possible to develop your own caching backend by subclassing flask_caching.backends.base.BaseCache class Let's start by modifying our add blog page to include an option to upload an image. First, we'll modify the form-horizontal to a vertical form, so remove the class form-horizontal from the form. We'll also add three new controls: a file upload control to upload photos. a check box to mark the blog post as private source your env.sh file that has the database connection string. enter python console. >>>from app.py import db (you will do this in the python console.Assuming that app.py is the file where Flask app is instantiated and has the line db = SQLAlchemy (app) >>>db.create_all () That's it. All tables will be created From Data to Graph. a Web Journey With Flask and SQLite: On my previous tutorial, Python WebServer With Flask and Raspberry Pi, we learned how to interact with the physical world, thru a web front-end page, built with Flask. So, the next natural step is collect data from the real world, having them avail

Luckily, Flask-SQLAlchemy comes with a nice helper for doing just this. Create a new sub-folder named scripts in the blog project's app directory. Then create a file named create_db.py: (blog) $ cd app/ (blog) $ mkdir scripts (blog) $ touch scripts/create_db.py. Add the following code to the create_db.py module Let's install flask-sqlalchemy. On your terminal, paste the below command: python3 -m pip install flask-sqlalchemy. What exactly is flask-sqlalchemy? Well, it is a Flask extension that adds support for sqlalchemy and simplifies many MySQL tasks. It uses Object Relational Mapping (ORM), making it easier for you to run queries without writing.

The Microservices with Docker, Flask, and React course bundle is the best course I've ever purchased! It teaches you how to design and build a microservices web application that can be deployed as a real production app. What really makes Michael's teaching unique is that after the basic guidelines, he pushes you to read and explore each tool, technology, and framework used in the course. If you want to use the filename of the client to store the file on the server, user. theme, image: url_for (user_image, filename = user. image),} Depending on your API design, you may want to create JSON responses for types Flask-SQLAlchemy provides SQLAlchemy support that makes it simple and easy to use with Flask. For more on. Vue.js + Flask + Flask-SQLAlchemy: Part 4: notes on stuff (keep increasing) Now by adding <v-img :src=image_location : However, Vue already provides few good solutions, like props etc. Global store seems to be more capable and Vuex is a name that I hear over and over again. Managing State in Vue.js. By Hassan Djirdeh (@djirdehh). Flask-SQLAlchemy. Flask-SQLAlchemy. is an extension that provides support for SQLAlchemy ORM in the Flask framework. Configuration. The extension uses the SQLALCHEMY_DATABASE_URI configuration parameter to connect to the underlying data store. It supplies the connection URI format to the SQL Alchemy, by using the following pattern

Flask-Uploads¶. Flask-Uploads allows your application to flexibly and efficiently handle file uploading and serving the uploaded files. You can create different sets of uploads - one for document attachments, one for photos, etc. - and the application can be configured to save them all in different places and to generate different URLs for them SQLAlchemySchema is nearly identical in API to marshmallow_sqlalchemy.SQLAlchemySchema with the following exceptions:. By default, SQLAlchemySchema uses the scoped session created by Flask-SQLAlchemy. SQLAlchemySchema subclasses flask_marshmallow.Schema, so it includes the jsonify method.. Note: By default, Flask's jsonify method sorts the list of keys and returns consistent results to. Flask-Migrate is an extension that configures Alembic in the proper way to work with your Flask and Flask-SQLAlchemy application. In terms of the actual database migrations, everything is handled by Alembic so you get exactly the same functionality flask documentation: Save uploads on the server. Example. Uploaded files are available in request.files, a MultiDict mapping field names to file objects. Use getlist — instead of [] or get — if multiple files were uploaded with the same field name.. request.files['profile'] # single file (even if multiple were sent) request.files.getlist('charts') # list of files (even if one was sent The Web Server Gateway Interface (WSGI) is a simple calling convention for web servers to forward requests to web applications or frameworks written in the Python programming language.. Flask Jinja2. Jinja2 is a Flask templating engine. A template engine or template processor is a library designed to combine templates with a data model to produce documents

SQLAlchemy-ImageAttach — SQLAlchemy-ImageAttach 1

This script is the perfect instance of Python flask file upload example. It defines all required URIs for performing file upload operations. I have used upload.html page for uploading file to the desired directory. In the next section I will talk about this template file - upload.html. I show success message on successful file upload Python. sqlalchemy.DateTime () Examples. The following are 30 code examples for showing how to use sqlalchemy.DateTime () . These examples are extracted from open source projects. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example Line 1: Here we are importing the Flask module and creating a Flask web server from the Flask module. Line 3: __name__ means this current file. In this case, it will be main.py. This current file will represent my web application. We are creating an instance of the Flask class and calling it app Models created in Flask-SQLAlchemy are represented by classes that then translate to tables in a database. The attributes of those classes then turn into columns for those tables. Let's go ahead and create that user model: nano project/models.py This code creates a user model with columns for an id, email, password, and name Flask-SQLAlchemy & psycopg2. When it comes to relational databases my weapon of choice is PostgreSQL. Redis is just a key / value store that you can use to back your Celery jobs. I like to use Redis instead of RabbitMQ because I often use Redis for other things such as a cache, and 1 Redis instance can easily handle doing both things for.

Upload a File with Python Flask. File uploading is a common task in web apps. In this tutorial you learn how to do that with Python Flask. It is very simple to upload the file upload in the Flask file by the Flask file the last item that we need to cover is how to edit the data in the database. one of the easiest ways to do this would be to search for an item and add a way for the user to edit the items that.

Marcello Dezallez_DSC7450 | FemaleMuscle, Female

Serving Static Files in Flask. Static Files are files which don't change very often, for example, CSS files, JS files, font files etc. By default, Flask looks for static files in the static sub-directory inside the application directory. We can change this default, by passing name of the directory to the static_folder keyword argument while. Run the following commands in the console, Create a file called api.py and import the libraries you just installed. Like this, You can create an API with the main Flask library, but in the long run it is easier to use the Flask library specialized in creating APIs. Add the following lines of code ORM stands for Object Relational Mapper, it is a tool that allows developers to store and retrieve data using object oriented approaches and solves the object-relational impedance mismatch. Also, Flask-SQLAlchemy is an extension that provides support for SQLAlchemy ORM in the Flask framework. In the - Model.py file, add the following code to it Where to Store Your Unit Tests. Based on the flexibility that using unit test runners gives you, you could probably store your unit test files in any location in your Flask application. However, I find it best to store the unit tests (in this case located in the 'tests' directory) at the same level as the files that you are going to be testing flask, flask-sqlalchemy, html, python / By Franz Biberkopf I am new in Python Flask and I am trying to design my personal blog. Since it is only for private use, I would like to put the add page for post as protected area with a username and a password just for to add and manage my posts

Video: Column and Data Types — SQLAlchemy 1

Waves Archives - HDWallSourceConnect Flask to a Database with Flask-SQLAlchemy - DEVpycharm中flask操作数据库 - HolaWorld - 博客园How To: Create a Flask API with JWT-Based AuthenticationNever Forget A Friend’s Birthday with Python, Flask andBlog - Page 4 of 6 - Amy Peniston

BaseQuery seems to be the default if you use Flask and other options are subclasses, as explained here: API - Flask-SQLAlchemy 0.16 documentation It's still far from complete, so a convert into Query method may not be implemented yet. You can r.. $ sudo pip install Flask-SqlAlchemy SQLAlchemy is an SQL toolkit and object-relational mapper (ORM) for the Python programming language. It has support for MySQL, Microsoft SQL Server and many more relational database management systems Flask-SQLAlchemy_ Flask-SQLAlchemy is an extension for Flask_ that adds support for SQLAlchemy to your application. Flask-Admin_ The admin interface framework for Flask_. With scaffolding for SQLAlchemy, MongoEngine, pymongo and Peewee. pyramid_sqlalchemy_ pyramid_sqlalchemy provides everything needed to use SQLAlchemy in Pyramid_ applications Flask does not provide an integrated Model (M) layer, and lets you pick your database solution. A popular choice is Flask-SQLAlchemy with a ORM (Object-Relational Mapper) over a relational database such as MySQL or PostgreSQL. You can also store all the macros in a standalone file, and import them into a template. In Flask, the static. Now, we need to learn not to reinvent wheels and there are many great projects out there existing solving the problems we also have.. In this chapter, I will show how to give our Vue.js frontend some Google Materials Design feeling with Vuetify.And then I also show you a neat component Vue2-dropzone that allows drag and drop file upload