dropzone npm(開發者的使用方法)
文件上傳是網頁應用程式中的一個常見功能,使其更易於使用對於良好的使用者體驗至關重要。 一個簡化此過程的流行程式庫是 Dropzone.js。 當與 React 結合時,Dropzone 可以是一個實現拖放文件上傳的強大工具。 react-dropzone 可完美無縫合併,且開發工作量極少。 本文將指引您透過使用 react-dropzone 套件,將 Dropzone 與 React 應用程式整合,這是一個包裝在 Dropzone.js 程式庫上的出色包。
在這篇文章中,我們還將看看 IronPDF NPM 套件,用於生成、編輯和管理 PDF 文件。
為什麼在 React 中使用 Dropzone?
Dropzone 提供了多種功能,讓文件上傳變得無縫:
1. 拖放介面
允許使用者拖放文件以啟用文件選擇,並程式化地添加文件對話框。
2. 預覽
顯示從丟棄的文件中獲取的默認圖片縮圖預覽,增強了用戶介面可讀性。
3. 多文件上傳
支持一次上傳多個文件。
4. 可自定義
可以通過多種選項和回調進行高度自定義。 您可以自定義文件對話框打開或文件選擇對話框。
5. 大文件分片上傳
使用分片上傳大文件。
6. 處理事件
可以處理文件對話框取消回調和瀏覽器圖片調整事件。
設置 React 應用程式
在整合 Dropzone 之前,確保您已設置好 React 應用程式。如果您還沒有,可以使用 Create React App 創建一個新的 React 專案:
npx create-react-app dropzone-demo
cd dropzone-demonpx create-react-app dropzone-demo
cd dropzone-demo安裝 react-dropzone
要在您的 React 專案中使用 Dropzone,您需要安裝 react-dropzone package:
npm install react-dropzone
# or
yarn add react-dropzonenpm install react-dropzone
# or
yarn add react-dropzonereact-dropzone 的基本使用
以下是一個在 React 元件中使用 react-dropzone 的簡單範例:
import React, { useCallback } from 'react';
import { useDropzone } from 'react-dropzone';
// DropzoneComponent is a React component demonstrating basic usage of react-dropzone
const DropzoneComponent = () => {
// Callback to handle file drops
const onDrop = useCallback((acceptedFiles) => {
console.log(acceptedFiles); // Log the accepted files
}, []);
// Extracted properties from useDropzone hook
const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
return (
<div {...getRootProps()} style={dropzoneStyle}>
<input {...getInputProps()} />
{
isDragActive ?
<p>Drop the files here ...</p> :
<p>Drag 'n' drop some files here, or click to select files</p>
}
</div>
);
};
// Styles for the dropzone area
const dropzoneStyle = {
border: '2px dashed #0087F7',
borderRadius: '5px',
padding: '20px',
textAlign: 'center',
cursor: 'pointer'
};
export default DropzoneComponent;import React, { useCallback } from 'react';
import { useDropzone } from 'react-dropzone';
// DropzoneComponent is a React component demonstrating basic usage of react-dropzone
const DropzoneComponent = () => {
// Callback to handle file drops
const onDrop = useCallback((acceptedFiles) => {
console.log(acceptedFiles); // Log the accepted files
}, []);
// Extracted properties from useDropzone hook
const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
return (
<div {...getRootProps()} style={dropzoneStyle}>
<input {...getInputProps()} />
{
isDragActive ?
<p>Drop the files here ...</p> :
<p>Drag 'n' drop some files here, or click to select files</p>
}
</div>
);
};
// Styles for the dropzone area
const dropzoneStyle = {
border: '2px dashed #0087F7',
borderRadius: '5px',
padding: '20px',
textAlign: 'center',
cursor: 'pointer'
};
export default DropzoneComponent;處理文件上傳
當文件被丟棄或選擇時,onDrop 回調函數會接收到接受的文件數組。 然後您可以處理這些文件,諸如將它們上傳到伺服器。 下面是如何擴展 onDrop 回調來使用 fetch 上傳文件:
// onDrop callback to handle file uploads
const onDrop = useCallback((acceptedFiles) => {
const formData = new FormData();
// Append each file to the formData
acceptedFiles.forEach((file) => {
formData.append('files', file);
});
// Send a POST request to upload the files
fetch('https://your-upload-endpoint', {
method: 'POST',
body: formData,
})
.then(response => response.json()) // Parse the JSON from the response
.then(data => console.log(data)) // Log the response data
.catch(error => console.error('Error:', error)); // Handle errors
}, []);// onDrop callback to handle file uploads
const onDrop = useCallback((acceptedFiles) => {
const formData = new FormData();
// Append each file to the formData
acceptedFiles.forEach((file) => {
formData.append('files', file);
});
// Send a POST request to upload the files
fetch('https://your-upload-endpoint', {
method: 'POST',
body: formData,
})
.then(response => response.json()) // Parse the JSON from the response
.then(data => console.log(data)) // Log the response data
.catch(error => console.error('Error:', error)); // Handle errors
}, []);顯示預覽
您也可以顯示已上傳文件的預覽。 以下是怎麼做到的範例:
import React, { useCallback, useState } from 'react';
import { useDropzone } from 'react-dropzone';
const DropzoneComponent = () => {
const [files, setFiles] = useState([]);
// onDrop callback to handle file drops and generate previews
const onDrop = useCallback((acceptedFiles) => {
setFiles(acceptedFiles.map(file => Object.assign(file, {
preview: URL.createObjectURL(file)
})));
}, []);
const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
// Generate thumbnails for each file
const thumbs = files.map(file => (
<div key={file.name}>
<img
src={file.preview}
style={{ width: '100px', height: '100px' }}
alt={file.name}
/>
</div>
));
return (
<div>
<div {...getRootProps()} style={dropzoneStyle}>
<input {...getInputProps()} />
{
isDragActive ?
<p>Drop the files here ...</p> :
<p>Drag 'n' drop some files here, or click to select files</p>
}
</div>
<div>
{thumbs}
</div>
</div>
);
};
// Styles for the dropzone area
const dropzoneStyle = {
border: '2px dashed #0087F7',
borderRadius: '5px',
padding: '20px',
textAlign: 'center',
cursor: 'pointer'
};
export default DropzoneComponent;import React, { useCallback, useState } from 'react';
import { useDropzone } from 'react-dropzone';
const DropzoneComponent = () => {
const [files, setFiles] = useState([]);
// onDrop callback to handle file drops and generate previews
const onDrop = useCallback((acceptedFiles) => {
setFiles(acceptedFiles.map(file => Object.assign(file, {
preview: URL.createObjectURL(file)
})));
}, []);
const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
// Generate thumbnails for each file
const thumbs = files.map(file => (
<div key={file.name}>
<img
src={file.preview}
style={{ width: '100px', height: '100px' }}
alt={file.name}
/>
</div>
));
return (
<div>
<div {...getRootProps()} style={dropzoneStyle}>
<input {...getInputProps()} />
{
isDragActive ?
<p>Drop the files here ...</p> :
<p>Drag 'n' drop some files here, or click to select files</p>
}
</div>
<div>
{thumbs}
</div>
</div>
);
};
// Styles for the dropzone area
const dropzoneStyle = {
border: '2px dashed #0087F7',
borderRadius: '5px',
padding: '20px',
textAlign: 'center',
cursor: 'pointer'
};
export default DropzoneComponent;清理
撤消物件 URL 來防止記憶體洩漏是必要的。 您可以使用 useEffect 鉤子來實現這一點:
import { useEffect } from 'react';
// useEffect to clean up object URLs to prevent memory leaks
useEffect(() => {
// Revoke the data URIs
return () => files.forEach(file => URL.revokeObjectURL(file.preview));
}, [files]);import { useEffect } from 'react';
// useEffect to clean up object URLs to prevent memory leaks
useEffect(() => {
// Revoke the data URIs
return () => files.forEach(file => URL.revokeObjectURL(file.preview));
}, [files]);介紹IronPDF
IronPDF 是一個強大的 npm 套件,專為在 Node.js 應用程式中簡化 PDF 生成而設計。 它允許從 HTML 內容、URL,甚至現有的 PDF 文件中創建 PDF 文件。 不論您是在生成發票、報告或任何其他類型的文件,IronPDF 透過其直觀的 API 和強大的功能集簡化了這一過程。
IronPDF 的關鍵特性包括
1. HTML 到 PDF 的轉換
輕鬆將HTML內容轉換為PDF文件。 此功能特別適用於從網頁內容生成動態PDF。
2. URL 到 PDF 的轉換
直接從 URL 生成 PDF。 這使您可以捕捉網頁內容並程式化地將它們保存為 PDF 文件。
3. PDF 操作
輕鬆合併、拆分和操作現有的PDF文件。 IronPDF 提供多種操作 PDF 文件的功能,如添加頁面、拆分文檔等。
4. PDF 安全性
通過設置密碼或應用數位簽章來保障您的PDF文件。 IronPDF提供選項來保護您的敏感文件免受未經授權的訪問。
5. 高質量輸出
生成高品質的PDF文件,精確渲染文字、圖像和格式。 IronPDF確保您生成的PDF完整忠於原始內容。
6. 跨平台兼容性
IronPDF 與多個平台兼容,包括 Windows、Linux 和 macOS,適合多種開發環境。
7. 簡單整合
輕鬆將IronPDF整合到您的Node.js應用程式中,使用其npm套件。 API文件齊全,使得將PDF生成能力融入您的專案變得簡單明瞭。
不論您是在建構網頁應用程式、伺服器端腳本或命令列工具,IronPDF 能夠高效且可靠地為您創建專業級 PDF 文檔。
使用 IronPDF 生成 PDF 文件並使用 Dropzone NPM 套件
安裝依賴項: 首先,使用以下命令創建一個新的 Next.js 項目(如果還沒有的話):請參閱設置 頁面。
npx create-next-app@latest demo-dropzone-ironpdf --use-npm --example "https://github.com/vercel/next-learn/tree/main/basics/learn-starter"npx create-next-app@latest demo-dropzone-ironpdf --use-npm --example "https://github.com/vercel/next-learn/tree/main/basics/learn-starter"接下來,導航到項目目錄:
cd demo-dropzone-ironpdfcd demo-dropzone-ironpdf安裝所需的套件:
npm install @ironsoftware/ironpdf
npm install react-dropzonenpm install @ironsoftware/ironpdf
npm install react-dropzone創建 PDF: 現在,讓我們創建一個使用 IronPDF 生成 PDF 的簡單範例。 在您的 Next.js 元件(例如,pages/index.tsx)中添加以下代碼:
import Head from 'next/head';
import styles from '../styles/Home.module.css';
import { ToastContainer, toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { useState } from "react";
import DropzoneComponent from "../components/mydropzone";
export default function Home() {
const [textInput, setTextInput] = useState('');
// Function to display different types of toast messages
const notify = () => {
toast.success("Success! This is a success message.", {
position: "top-right"
});
toast.info("Information message", {
position: "bottom-left"
});
toast.warn("Warning message", {
autoClose: 5000
});
toast.error("Error message", {
className: 'custom-toast',
style: { background: 'red', color: 'white' }
});
};
// Function to generate and download a PDF
const generatePdf = async () => {
try {
const response = await fetch('/api/pdf?url=' + textInput);
const blob = await response.blob();
const url = window.URL.createObjectURL(new Blob([blob]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'awesomeIron.pdf');
document.body.appendChild(link);
link.click(); // Trigger the download
link.parentNode.removeChild(link); // Remove the link
} catch (error) {
console.error('Error generating PDF:', error);
}
};
// Handle changes in the text input field
const handleChange = (event) => {
setTextInput(event.target.value);
}
return (
<div className={styles.container}>
<Head>
<title>Generate PDF Using IronPDF</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<h1>Demo Drop Zone and Generate PDF Using IronPDF</h1>
<DropzoneComponent />
<p>
<span>Enter Url To Convert to PDF:</span>{" "}
</p>
<button style={{ margin: 20, padding: 5 }} onClick={generatePdf}>Generate PDF</button>
</main>
<style jsx>{`
main {
padding: 5rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
footer {
width: 100%;
height: 100px;
border-top: 1px solid #eaeaea;
display: flex;
justify-content: center;
align-items: center;
}
footer img {
margin-left: 0.5rem;
}
footer a {
display: flex;
justify-content: center;
align-items: center;
text-decoration: none;
color: inherit;
}
code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo,
Monaco,
Lucida Console,
Liberation Mono,
DejaVu Sans Mono,
Bitstream Vera Sans Mono,
Courier New,
monospace;
}
`}</style>
<style jsx global>{`
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system,
BlinkMacSystemFont,
Segoe UI,
Roboto,
Oxygen,
Ubuntu,
Cantarell,
Fira Sans,
Droid Sans,
Helvetica Neue,
sans-serif;
}
* {
box-sizing: border-box;
}
`}</style>
</div>
);
}import Head from 'next/head';
import styles from '../styles/Home.module.css';
import { ToastContainer, toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { useState } from "react";
import DropzoneComponent from "../components/mydropzone";
export default function Home() {
const [textInput, setTextInput] = useState('');
// Function to display different types of toast messages
const notify = () => {
toast.success("Success! This is a success message.", {
position: "top-right"
});
toast.info("Information message", {
position: "bottom-left"
});
toast.warn("Warning message", {
autoClose: 5000
});
toast.error("Error message", {
className: 'custom-toast',
style: { background: 'red', color: 'white' }
});
};
// Function to generate and download a PDF
const generatePdf = async () => {
try {
const response = await fetch('/api/pdf?url=' + textInput);
const blob = await response.blob();
const url = window.URL.createObjectURL(new Blob([blob]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'awesomeIron.pdf');
document.body.appendChild(link);
link.click(); // Trigger the download
link.parentNode.removeChild(link); // Remove the link
} catch (error) {
console.error('Error generating PDF:', error);
}
};
// Handle changes in the text input field
const handleChange = (event) => {
setTextInput(event.target.value);
}
return (
<div className={styles.container}>
<Head>
<title>Generate PDF Using IronPDF</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<h1>Demo Drop Zone and Generate PDF Using IronPDF</h1>
<DropzoneComponent />
<p>
<span>Enter Url To Convert to PDF:</span>{" "}
</p>
<button style={{ margin: 20, padding: 5 }} onClick={generatePdf}>Generate PDF</button>
</main>
<style jsx>{`
main {
padding: 5rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
footer {
width: 100%;
height: 100px;
border-top: 1px solid #eaeaea;
display: flex;
justify-content: center;
align-items: center;
}
footer img {
margin-left: 0.5rem;
}
footer a {
display: flex;
justify-content: center;
align-items: center;
text-decoration: none;
color: inherit;
}
code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo,
Monaco,
Lucida Console,
Liberation Mono,
DejaVu Sans Mono,
Bitstream Vera Sans Mono,
Courier New,
monospace;
}
`}</style>
<style jsx global>{`
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system,
BlinkMacSystemFont,
Segoe UI,
Roboto,
Oxygen,
Ubuntu,
Cantarell,
Fira Sans,
Droid Sans,
Helvetica Neue,
sans-serif;
}
* {
box-sizing: border-box;
}
`}</style>
</div>
);
}由於 IronPDF 僅在 Node 上運行,接下來為該應用程式新增一個 API,其中 PDF 在節點上生成。
創建一個文件 pdf.js 在 pages/api 資料夾並添加以下源代碼:
// pages/api/pdf.js
import { IronPdfGlobalConfig, PdfDocument } from "@ironsoftware/ironpdf";
// Apply your IronPDF license key
IronPdfGlobalConfig.getConfig().licenseKey = "Add Your key here";
export default async function handler(req, res) {
try {
const url = req.query.url;
const pdf = await PdfDocument.fromUrl(url);
const data = await pdf.saveAsBuffer();
console.log('PDF data:', data);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=awesomeIron.pdf');
res.send(data);
} catch (error) {
console.error('Error generating PDF:', error);
res.status(500).end();
}
}// pages/api/pdf.js
import { IronPdfGlobalConfig, PdfDocument } from "@ironsoftware/ironpdf";
// Apply your IronPDF license key
IronPdfGlobalConfig.getConfig().licenseKey = "Add Your key here";
export default async function handler(req, res) {
try {
const url = req.query.url;
const pdf = await PdfDocument.fromUrl(url);
const data = await pdf.saveAsBuffer();
console.log('PDF data:', data);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=awesomeIron.pdf');
res.send(data);
} catch (error) {
console.error('Error generating PDF:', error);
res.status(500).end();
}
}注意: 在上述代碼中,請確保添加您自己的授權金鑰。
運行您的應用: 啟動您的 Next.js 應用:
npm run dev
# or
yarn devnpm run dev
# or
yarn dev現在,輸入網站 URL 以生成 PDF 並點擊"生成 PDF"。 如所示,將下載一個名為 awesomeIron.pdf 的文件。
現在點擊 Dropzone 並選擇下載的文件。這將顯示一個文件預覽,名稱顯示在底部:awesomeIron.pdf。
IronPDF授權
有關授權詳細資訊,請參閱 IronPDF 頁面。
如下所示將授權金鑰放置在應用中:
import { IronPdfGlobalConfig, PdfDocument } from "@ironsoftware/ironpdf";
// Apply your IronPDF license key
IronPdfGlobalConfig.getConfig().licenseKey = "Add Your key here";import { IronPdfGlobalConfig, PdfDocument } from "@ironsoftware/ironpdf";
// Apply your IronPDF license key
IronPdfGlobalConfig.getConfig().licenseKey = "Add Your key here";結論
使用 Dropzone 與 React 結合使用 react-dropzone 的過程非常簡單,大大提升了文件上傳體驗。 憑藉諸如拖放、文件預覽和擴展定制選項等功能,react-dropzone 可以成為您 React 專案的寶貴補充。 開始探索其功能並根據應用程序的需求量身訂製吧!
IronPDF,另一方面,是一個多功能的 PDF 生成和操作程式庫,使其很容易整合到應用程式中。 IronPDF 提供了詳細的 文檔 和 代碼範例,以幫助開發人員開始使用。
按照本文中的步驟,您可以在 React 應用程式中創建一個強大的文件上傳組件,還可以將 PDF 文件生成功能整合到現代應用程式中。








