test-do-not-use-react-drop-to-upload
Version:
React component for drop-to-upload
133 lines (96 loc) • 6.94 kB
Markdown
# HTML5 drop-to-upload component for React
<span class="badge-npmversion"><a href="https://npmjs.org/package/badges" title="View this project on NPM"><img src="https://img.shields.io/npm/v/react-drop-to-upload.svg" alt="NPM version" /></a></span>
A simple React component for "drop-to-upload" feature. File dropped will be returned as `ArrayBuffer` or Data URI.
It supports Internet Explorer 10 and up, and all major desktop browsers. You can also check up-to-date browser compatibilities at [Can I use ___?](http://caniuse.com/#feat=dragndrop).
## How to use
Install our package thru NPM.
`npm install react-drop-to-upload`
Add the following code to your React component to import the `react-drop-to-upload` component.
```js
import DropToUpload from 'react-drop-to-upload';
```
And in the render loop, add the following JSX code to instantiate the component.
```jsx
<DropToUpload
onDrop={ this.handleDrop }
/>
```
When a file is dropped, `handleDrop` will be triggered. For example, the following code use `FormData` and [`fetch`](https://github.com/github/fetch) to upload all dropped files to the server at `/upload` via HTTP POST.
```js
handleDrop(files) {
var data = new FormData();
files.forEach((file, index) => {
data.append('file' + index, file);
});
fetch('/upload', {
method: 'POST',
body: data
});
}
```
Additionally, if `onDropArrayBuffer` or `onDropDataURI` props are specified, the file will be read as `ArrayBuffer` and/or data URIs, and then passed to the corresponding handlers.
## Supported props
Followings are list of props supported by the component.
| Name | Supported types | Default | Description |
| ------------------------------------------ | ---------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| `className` | String | | Class name to apply |
| `dropEffect` | `copy`, `link`, `move`, or `none` | | Drop effect to show when `onDragOver` is emitted |
| `element` | String or React element | `"div"` | Component type of the dropping element |
| `id` | String | | HTML ID of the element |
| `onDrop(File[])` | Function | | Handler to call when a file is dropped |
| `onDropArrayBuffer(ArrayBuffer[], File[])` | Function | | Handler to call when a file is dropped and read as `ArrayBuffer` |
| `onDropDataURI(string[], File[])` | Function | | Handler to call when a file is dropped and read as [Data URI](https://en.wikipedia.org/wiki/Data_URI_scheme) |
| `onLeave` | Function | | Handler to call when a cursor has left without dropping anything, i.e. `onDragLeave` |
| `onOver` | Function | | Handler to call when a cursor is over with droppable item, i.e. `onDragOver` |
| `style` | Map | | Inline style |
### Points to note
* If `onDropArrayBuffer` is not specified, the component will not issue any I/O operations to read the file content. This also applies to `onDropDataURI`
* If both `onDropArrayBuffer` and `onDropDataURI` are specified, it will read the file twice by calling `FileReader.readAsArrayBuffer` and `FileReader.readAsDataURL` simultaneously
## Sample code
```jsx
import React, { Component } from 'react';
import DropToUpload from 'react-drop-to-upload';
class Page extends Component {
constructor(props) {
super(props);
this.handleDrop = this.handleDrop.bind(this);
this.handleDropArrayBuffer = this.handleDropArrayBuffer.bind(this);
this.handleDropDataURI = this.handleDropDataURI.bind(this);
}
handleDrop(files) {
console.log(files.length > 0); // true
console.log(files[0] instanceof File); // true
}
handleDropArrayBuffer(arrayBuffers, files) {
console.log(files.length > 0); // true
console.log(files.length === arrayBuffers.length); // true
console.log(files[0] instanceof File); // true
console.log(arrayBuffers[0] instanceof ArrayBuffer); // true
}
handleDropDataURI(dataURIs, files) {
console.log(files.length > 0); // true
console.log(files.length === dataURIs.length); // true
console.log(files[0] instanceof File); // true
console.log(typeof dataURIs[0] === 'string'); // true
console.log(/^data:(.*);(.*),/.test(dataURIs[0])); // true
}
render() {
return (
<DropToUpload
onDrop={ this.handleDrop }
onDropArrayBuffer={ this.handleDropArrayBuffer }
onDropDataURI={ this.handleDropDataURI }
/>
);
}
}
```
## Changelog
* 0.0.1 (2016-09-27)
* Initial commit
## Contributions
Fork our [repository](https://github.com/compulim/react-drop-to-upload) and clone it to your box. Then type `npm install`, followed by `npm run selfhost`. A Webpack development server will then up at [http://localhost:8080/](http://localhost:8080/) for testing and debugging.
We recommend [Visual Studio Code](https://code.visualstudio.com/) with [Chrome debugger extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) for best debugging experience. Open the workspace with Visual Studio Code and press F5 to start debugging in Chrome.
Like us? Please star our [NPM package](https://npmjs.com/react-drop-to-upload) and [GitHub repository](https://github.com/compulim/react-drop-to-upload).
Don't feel quite right? Please [file a wish or an issue](https://github.com/compulim/react-drop-to-upload/issues) to us.
Want to give us a hand? Please look at our [issue list](https://github.com/compulim/react-drop-to-upload/issues) and submit pull requests.