{"id":30804,"date":"2025-10-02T08:41:09","date_gmt":"2025-10-02T05:41:09","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30804"},"modified":"2025-10-02T08:41:09","modified_gmt":"2025-10-02T05:41:09","slug":"reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/","title":{"rendered":"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<h2>React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>React uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen kritik bir \u00f6zelliktir. Geleneksel dosya se\u00e7me diyaloglar\u0131, \u00f6zellikle birden fazla dosya y\u00fcklenmesi gerekti\u011finde veya kullan\u0131c\u0131lar\u0131n dosyalar\u0131 do\u011frudan aray\u00fcz \u00fczerine s\u00fcr\u00fckleyerek i\u015flem yapmak istedi\u011fi durumlarda yetersiz kalabilir. \u0130\u015fte bu noktada &#8220;s\u00fcr\u00fckle ve b\u0131rak&#8221; (drag and drop) \u00f6zelli\u011fi devreye girer. S\u00fcr\u00fckle ve b\u0131rak, kullan\u0131c\u0131lar\u0131n dosyalar\u0131 taray\u0131c\u0131 penceresi i\u00e7indeki belirli bir alana kolayca ta\u015f\u0131yarak y\u00fcklemesini sa\u011flayan modern ve sezgisel bir yakla\u015f\u0131md\u0131r. Bu makalede, React tabanl\u0131 projelerinizde <code>react-dropzone<\/code> k\u00fct\u00fcphanesini kullanarak nas\u0131l etkili ve kullan\u0131c\u0131 dostu s\u00fcr\u00fckle ve b\u0131rak dosya y\u00fckleme alanlar\u0131 olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p><code>react-dropzone<\/code>, React uygulamalar\u0131nda s\u00fcr\u00fckle ve b\u0131rak dosya y\u00fckleme i\u015flevselli\u011fini implemente etmeyi son derece kolayla\u015ft\u0131ran pop\u00fcler bir k\u00fct\u00fcphanedir. Taray\u0131c\u0131lar\u0131n yerel s\u00fcr\u00fckle ve b\u0131rak API&#8217;sinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 soyutlayarak, bize basit ve esnek bir API sunar. Bu sayede, dosya kabul kriterleri belirleme, \u00f6nizlemeler olu\u015fturma, hata y\u00f6netimi ve stil \u00f6zelle\u015ftirmeleri gibi bir\u00e7ok \u00f6zelli\u011fi h\u0131zl\u0131ca entegre edebiliriz. Bu makale boyunca, s\u0131f\u0131rdan bir React projesi olu\u015fturmaktan, <code>react-dropzone<\/code>&#8216;u entegre etmeye, dosya \u00f6nizlemeleri olu\u015fturmaya ve hatta sunucu taraf\u0131na dosya g\u00f6nderme mant\u0131\u011f\u0131n\u0131 anlamaya kadar geni\u015f bir yelpazede bilgi edineceksiniz.<\/p>\n<h3>Giri\u015f: Neden S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme?<\/h3>\n<p>Dosya y\u00fckleme, web uygulamalar\u0131n\u0131n ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Profil resimleri, belgeler, videolar veya di\u011fer medya t\u00fcrleri olsun, kullan\u0131c\u0131lar\u0131n dosya g\u00f6ndermesi s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir senaryodur. Geleneksel <code><input type=\"file\"><\/code> etiketi bu i\u015fi yaparken, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan baz\u0131 s\u0131n\u0131rlamalara sahiptir:<\/p>\n<p>*   <strong>Tek Tek Se\u00e7im:<\/strong> \u00c7o\u011fu durumda, kullan\u0131c\u0131lar\u0131n dosya se\u00e7me diyalogunda birden fazla dosya se\u00e7mesi gerekir, ancak bu her zaman sezgisel de\u011fildir.<br \/>\n*   <strong>G\u00f6rsel Geri Bildirim Eksikli\u011fi:<\/strong> Kullan\u0131c\u0131lar bir dosya se\u00e7tikten sonra, dosyan\u0131n ger\u00e7ekten se\u00e7ilip se\u00e7ilmedi\u011fini veya y\u00fckleme alan\u0131na do\u011fru bir \u015fekilde eklenip eklenmedi\u011fini anlamakta zorlanabilirler.<br \/>\n*   <strong>Modern Beklentiler:<\/strong> G\u00fcn\u00fcm\u00fcz kullan\u0131c\u0131lar\u0131, web uygulamalar\u0131ndan ak\u0131c\u0131 ve interaktif deneyimler bekler. S\u00fcr\u00fckle ve b\u0131rak, bu beklentiyi kar\u015f\u0131layan g\u00fc\u00e7l\u00fc bir \u00f6zelliktir.<\/p>\n<p>S\u00fcr\u00fckle ve b\u0131rak dosya y\u00fckleme, bu sorunlara zarif bir \u00e7\u00f6z\u00fcm sunar. Kullan\u0131c\u0131lar, dosyalar\u0131 do\u011frudan masa\u00fcstlerinden veya dosya y\u00f6neticilerinden taray\u0131c\u0131 penceresindeki belirli bir alana s\u00fcr\u00fckleyip b\u0131rakabilirler. Bu, \u00f6zellikle birden fazla dosya y\u00fcklenmesi gereken durumlarda zaman kazand\u0131r\u0131r ve kullan\u0131m kolayl\u0131\u011f\u0131 sa\u011flar. <code>react-dropzone<\/code> gibi k\u00fct\u00fcphaneler, bu karma\u015f\u0131k i\u015flevselli\u011fi React bile\u015fenlerinize saniyeler i\u00e7inde entegre etmenizi sa\u011flar.<\/p>\n<h3>Temel Kavramlar<\/h3>\n<p><code>react-dropzone<\/code>&#8216;u derinlemesine incelemeden \u00f6nce, baz\u0131 temel kavramlar\u0131 anlamak faydal\u0131 olacakt\u0131r.<\/p>\n<h4>HTML&#8217;in Yerel S\u00fcr\u00fckle ve B\u0131rak API&#8217;si<\/h4>\n<p>Taray\u0131c\u0131lar, yerle\u015fik bir s\u00fcr\u00fckle ve b\u0131rak API&#8217;si sunar. Bu API, \u00e7e\u015fitli olay dinleyicileri arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131r:<\/p>\n<p>*   <code>dragenter<\/code>: S\u00fcr\u00fcklenen bir \u00f6\u011fe, ge\u00e7erli bir b\u0131rakma hedefinin \u00fczerine geldi\u011finde tetiklenir.<br \/>\n*   <code>dragover<\/code>: S\u00fcr\u00fcklenen bir \u00f6\u011fe, ge\u00e7erli bir b\u0131rakma hedefinin \u00fczerinde hareket ederken s\u00fcrekli olarak tetiklenir. Bu olayda <code>event.preventDefault()<\/code> \u00e7a\u011fr\u0131lmazsa, b\u0131rakma i\u015flemi ger\u00e7ekle\u015fmez.<br \/>\n*   <code>dragleave<\/code>: S\u00fcr\u00fcklenen bir \u00f6\u011fe, ge\u00e7erli bir b\u0131rakma hedefinden ayr\u0131ld\u0131\u011f\u0131nda tetiklenir.<br \/>\n*   <code>drop<\/code>: S\u00fcr\u00fcklenen bir \u00f6\u011fe, ge\u00e7erli bir b\u0131rakma hedefinin \u00fczerine b\u0131rak\u0131ld\u0131\u011f\u0131nda tetiklenir. Bu olayda <code>event.preventDefault()<\/code> \u00e7a\u011fr\u0131lmazsa, taray\u0131c\u0131 dosya \u00f6nizlemesini a\u00e7maya \u00e7al\u0131\u015fabilir.<\/p>\n<p>Bu olaylar\u0131 manuel olarak y\u00f6netmek, \u00f6zellikle dosya y\u00fckleme senaryolar\u0131nda, dosyalar\u0131n veri transferi nesnesinden (DataTransfer object) \u00e7\u0131kar\u0131lmas\u0131 ve i\u015flenmesi gerekti\u011finde olduk\u00e7a karma\u015f\u0131k olabilir. <code>react-dropzone<\/code> tam da bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlar.<\/p>\n<h4>React&#8217;ta Durum Y\u00f6netimi<\/h4>\n<p>React&#8217;ta se\u00e7ilen dosyalar\u0131 saklamak ve kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6stermek i\u00e7in bile\u015fen durumunu (<code>useState<\/code> hook&#8217;u ile) kullan\u0131r\u0131z. Dosyalar bir dizi halinde saklan\u0131r ve bu dizi, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (\u00f6rne\u011fin, dosya listesi veya \u00f6nizlemeler) g\u00fcncellenmesini tetikler.<\/p>\n<h3>react-dropzone&#8217;a Giri\u015f ve Kurulum<\/h3>\n<p><code>react-dropzone<\/code>, React&#8217;\u0131n hook&#8217;lar\u0131n\u0131 kullanarak s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini kolayca entegre etmenizi sa\u011flayan hafif bir k\u00fct\u00fcphanedir.<\/p>\n<h4>Kurulum<\/h4>\n<p>\u0130lk olarak, yeni bir React projesi olu\u015ftural\u0131m (e\u011fer hen\u00fcz bir tane yoksa) ve <code>react-dropzone<\/code>&#8216;u kural\u0131m.<\/p>\n<pre><code class=\"language-bash\"># Vite ile yeni bir React projesi olu\u015fturma (daha h\u0131zl\u0131)\nnpm create vite my-dropzone-app -- --template react-ts # TypeScript i\u00e7in\n<h2>veya<\/h2>\nnpm create vite my-dropzone-app -- --template react # JavaScript i\u00e7in\n\ncd my-dropzone-app\n\n<h2>react-dropzone k\u00fct\u00fcphanesini kurma<\/h2>\nnpm install react-dropzone\n<h2>veya yarn kullan\u0131yorsan\u0131z<\/h2>\nyarn add react-dropzone<\/code><\/pre>\n<p>Projemizi ba\u015flatt\u0131ktan sonra, <code>react-dropzone<\/code>&#8216;u kullanmaya haz\u0131r\u0131z.<\/p>\n<h4>Temel Kullan\u0131m: useDropzone Hook&#8217;u<\/h4>\n<p><code>react-dropzone<\/code>&#8216;un kalbinde <code>useDropzone<\/code> hook&#8217;u bulunur. Bu hook, bize s\u00fcr\u00fckle ve b\u0131rak alan\u0131n\u0131 olu\u015fturmak i\u00e7in gerekli olan \u00f6zellikleri ve geri bildirimleri sa\u011flar.<\/p>\n<p>Bir <code>FileUploader<\/code> bile\u015feni olu\u015ftural\u0131m ve <code>useDropzone<\/code>&#8216;u nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6relim.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/FileUploader.jsx\nimport React, { useState, useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nfunction FileUploader() {\n  const [files, setFiles] = useState([]); \/\/ Y\u00fcklenen dosyalar\u0131 saklamak i\u00e7in\n\n  \/\/ Dosyalar b\u0131rak\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facak callback fonksiyonu\n  const onDrop = useCallback(acceptedFiles => {\n    \/\/ Sadece kabul edilen dosyalar\u0131 duruma ekle\n    setFiles(prevFiles => [\n      ...prevFiles,\n      ...acceptedFiles.map(file => Object.assign(file, {\n        preview: URL.createObjectURL(file) \/\/ \u00d6nizleme URL'si olu\u015fturma\n      }))\n    ]);\n  }, []);\n\n  \/\/ useDropzone hook'unu \u00e7a\u011f\u0131r\u0131n\n  const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });\n\n  \/\/ Y\u00fcklenen dosyalar\u0131 listele\n  const fileList = files.map(file => (\n    <li key={file.name}>\n      {file.name} - {file.size} bytes\n      {file.type.startsWith('image\/') && (\n        <img\n          src={file.preview}\n          alt={file.name}\n          style={{ width: '100px', height: '100px', objectFit: 'cover', marginLeft: '10px' }}\n          onLoad={() => { URL.revokeObjectURL(file.preview) }} \/\/ Bellek s\u0131z\u0131nt\u0131s\u0131n\u0131 \u00f6nlemek i\u00e7in\n        \/>\n      )}\n    <\/li>\n  ));\n\n  return (\n    <div className=\"container\">\n      {\/<em> Dropzone alan\u0131 <\/em>\/}\n      <div\n        {...getRootProps()}\n        className={<code>dropzone ${isDragActive ? 'active' : ''}<\/code>}\n      >\n        <input {...getInputProps()} \/>\n        {\n          isDragActive ?\n            <p>Dosyalar\u0131 buraya b\u0131rak\u0131n...<\/p> :\n            <p>Dosyalar\u0131 buraya s\u00fcr\u00fckleyin ve b\u0131rak\u0131n, veya se\u00e7mek i\u00e7in t\u0131klay\u0131n.<\/p>\n        }\n      <\/div>\n\n      {\/<em> Y\u00fcklenen dosyalar\u0131n listesi <\/em>\/}\n      <aside>\n        <h4>Y\u00fcklenen Dosyalar<\/h4>\n        <ul>{fileList}<\/ul>\n      <\/aside>\n    <\/div>\n  );\n}\n\nexport default FileUploader;<\/code><\/pre>\n<p>Ve bu bile\u015feni <code>App.jsx<\/code>&#8216;inize ekleyelim:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/App.jsx\nimport React from 'react';\nimport FileUploader from '.\/components\/FileUploader';\nimport '.\/App.css'; \/\/ Stil dosyas\u0131n\u0131 dahil edin\n\nfunction App() {\n  return (\n    <div className=\"App\">\n      \n      <FileUploader \/>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>\u015eimdi temel stil tan\u0131mlamalar\u0131n\u0131 <code>App.css<\/code> dosyas\u0131na ekleyelim:<\/p>\n<pre><code class=\"language-css\">\/<em> src\/App.css <\/em>\/\n.App {\n  font-family: sans-serif;\n  text-align: center;\n  padding: 20px;\n}\n\n.container {\n  max-width: 800px;\n  margin: 0 auto;\n  border: 1px solid #ddd;\n  padding: 20px;\n  border-radius: 8px;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.dropzone {\n  border: 2px dashed #cccccc;\n  border-radius: 5px;\n  padding: 20px;\n  text-align: center;\n  color: #666;\n  cursor: pointer;\n  transition: border .24s ease-in-out;\n  margin-bottom: 20px;\n}\n\n.dropzone.active {\n  border-color: #2196f3; \/<em> S\u00fcr\u00fckleme an\u0131nda border rengini de\u011fi\u015ftir <\/em>\/\n  background-color: #e3f2fd;\n}\n\n.dropzone:hover {\n  border-color: #a0a0a0;\n}\n\naside ul {\n  list-style: none;\n  padding: 0;\n  margin-top: 20px;\n  text-align: left;\n}\n\naside li {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 10px;\n  padding: 10px;\n  border: 1px solid #eee;\n  border-radius: 4px;\n  background-color: #f9f9f9;\n}<\/code><\/pre>\n<p>Bu temel kurulum ile, dosyalar\u0131 s\u00fcr\u00fckleyip b\u0131rakabilece\u011finiz veya t\u0131klayarak se\u00e7ebilece\u011finiz bir alan\u0131n\u0131z olacak. Se\u00e7ilen dosyalar bir liste halinde g\u00f6r\u00fcnt\u00fclenecek ve e\u011fer bir resimse, k\u00fc\u00e7\u00fck bir \u00f6nizlemesi de g\u00f6sterilecektir. <code>URL.createObjectURL<\/code> ile olu\u015fturulan \u00f6nizleme URL&#8217;lerinin <code>onLoad<\/code> olay\u0131nda <code>URL.revokeObjectURL<\/code> ile serbest b\u0131rak\u0131lmas\u0131, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Uygulama Geli\u015ftirme Ad\u0131mlar\u0131<\/h3>\n<p>\u015eimdi, <code>react-dropzone<\/code>&#8216;un sundu\u011fu daha geli\u015fmi\u015f \u00f6zellikleri ve kullan\u0131m senaryolar\u0131n\u0131 ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h4>Ad\u0131m 1: Dosya Kabul Kriterleri ve Do\u011frulama<\/h4>\n<p><code>react-dropzone<\/code>, y\u00fcklenecek dosyalar i\u00e7in belirli kriterler belirlemenize olanak tan\u0131r. Bu, yanl\u0131\u015f dosya t\u00fcrlerinin veya \u00e7ok b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck dosyalar\u0131n y\u00fcklenmesini engellemek i\u00e7in \u00f6nemlidir.<\/p>\n<p><code>useDropzone<\/code> hook&#8217;una a\u015fa\u011f\u0131daki opsiyonlar\u0131 ge\u00e7irebilirsiniz:<\/p>\n<p><em>   <code>accept<\/code>: Kabul edilecek MIME tiplerini veya dosya uzant\u0131lar\u0131n\u0131 belirler. \u00d6rn: <code>'image\/<\/em>'<\/code> (t\u00fcm resimler), <code>'.png, .jpg, .jpeg'<\/code> veya <code>'application\/pdf'<\/code>.<br \/>\n*   <code>maxSize<\/code>: Dosyan\u0131n maksimum boyutunu bayt cinsinden belirler.<br \/>\n*   <code>minSize<\/code>: Dosyan\u0131n minimum boyutunu bayt cinsinden belirler.<br \/>\n*   <code>maxFiles<\/code>: Y\u00fcklenebilecek maksimum dosya say\u0131s\u0131n\u0131 belirler.<br \/>\n*   <code>noClick<\/code>: Dropzone alan\u0131na t\u0131kland\u0131\u011f\u0131nda dosya se\u00e7me diyalogunun a\u00e7\u0131lmas\u0131n\u0131 engeller.<br \/>\n*   <code>noKeyboard<\/code>: Klavye etkile\u015fimini devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<br \/>\n*   <code>noDrag<\/code>: S\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fini devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<br \/>\n*   <code>disabled<\/code>: Dropzone&#8217;u tamamen devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<\/p>\n<p>\u00d6rnek olarak, sadece resim dosyalar\u0131n\u0131 (maksimum 5MB) kabul eden ve en fazla 3 dosya y\u00fcklemeye izin veren bir yap\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/FileUploader.jsx (onDrop ve useDropzone k\u0131sm\u0131n\u0131 g\u00fcncelleyin)\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nfunction FileUploader() {\n  const [acceptedFiles, setAcceptedFiles] = useState([]);\n  const [fileRejections, setFileRejections] = useState([]); \/\/ Reddedilen dosyalar\u0131 saklamak i\u00e7in\n\n  const onDrop = useCallback((accepted, rejected) => {\n    \/\/ Kabul edilen dosyalar\u0131 i\u015fleme\n    setAcceptedFiles(prev => [\n      ...prev,\n      ...accepted.map(file => Object.assign(file, {\n        preview: URL.createObjectURL(file)\n      }))\n    ]);\n    \/\/ Reddedilen dosyalar\u0131 i\u015fleme\n    setFileRejections(prev => [...prev, ...rejected]);\n  }, []);\n\n  const {\n    getRootProps,\n    getInputProps,\n    isDragActive,\n    isDragAccept, \/\/ Kabul edilebilir dosya s\u00fcr\u00fckleniyor mu?\n    isDragReject \/\/ Kabul edilemez dosya s\u00fcr\u00fckleniyor mu?\n  } = useDropzone({\n    onDrop,\n    accept: {\n      'image\/jpeg': [],\n      'image\/png': []\n    },\n    maxSize: 5 <em> 1024 <\/em> 1024, \/\/ 5 MB\n    maxFiles: 3 \/\/ Maksimum 3 dosya\n  });\n\n  \/\/ Bellek s\u0131z\u0131nt\u0131s\u0131n\u0131 \u00f6nlemek i\u00e7in \u00f6nizleme URL'lerini temizle\n  useEffect(() => {\n    return () => acceptedFiles.forEach(file => URL.revokeObjectURL(file.preview));\n  }, [acceptedFiles]);\n\n  const acceptedFileItems = acceptedFiles.map(file => (\n    <li key={file.path}>\n      {file.path} - {file.size} bytes\n      {file.type.startsWith('image\/') && (\n        <img\n          src={file.preview}\n          alt={file.path}\n          style={{ width: '100px', height: '100px', objectFit: 'cover', marginLeft: '10px' }}\n        \/>\n      )}\n      <button onClick={() => removeFile(file.path)}>X<\/button> {\/<em> Dosya kald\u0131rma butonu <\/em>\/}\n    <\/li>\n  ));\n\n  const fileRejectionItems = fileRejections.map(({ file, errors }) => (\n    <li key={file.path}>\n      {file.path} - {file.size} bytes\n      <ul>\n        {errors.map(e => (\n          <li key={e.code}>{e.message}<\/li>\n        ))}\n      <\/ul>\n    <\/li>\n  ));\n\n  const removeFile = (filePath) => {\n    setAcceptedFiles(prev => prev.filter(file => file.path !== filePath));\n  };\n\n  const getDropzoneClassName = () => {\n    let className = 'dropzone';\n    if (isDragActive) {\n      className += ' active';\n    }\n    if (isDragAccept) {\n      className += ' accept';\n    }\n    if (isDragReject) {\n      className += ' reject';\n    }\n    return className;\n  };\n\n  return (\n    <div className=\"container\">\n      <div {...getRootProps({ className: getDropzoneClassName() })}>\n        <input {...getInputProps()} \/>\n        {\n          isDragActive ?\n            (isDragAccept ? <p>Dosyalar\u0131 buraya b\u0131rak\u0131n...<\/p> : <p>Bu dosya t\u00fcr\u00fc kabul edilmiyor!<\/p>) :\n            <p>Sadece JPG\/PNG resim dosyalar\u0131n\u0131 s\u00fcr\u00fckleyin ve b\u0131rak\u0131n (maks. 5MB, en fazla 3 dosya).<\/p>\n        }\n        <em>(T\u0131klayarak dosya se\u00e7me de m\u00fcmk\u00fcn)<\/em>\n      <\/div>\n\n      {acceptedFileItems.length > 0 && (\n        <aside>\n          <h4>Kabul Edilen Dosyalar<\/h4>\n          <ul>{acceptedFileItems}<\/ul>\n        <\/aside>\n      )}\n\n      {fileRejectionItems.length > 0 && (\n        <aside>\n          <h4>Reddedilen Dosyalar<\/h4>\n          <ul>{fileRejectionItems}<\/ul>\n        <\/aside>\n      )}\n    <\/div>\n  );\n}\n\nexport default FileUploader;<\/code><\/pre>\n<p>Ve stil dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-css\">\/<em> src\/App.css <\/em>\/\n\/<em> ... \u00f6nceki stiller ... <\/em>\/\n\n.dropzone.accept {\n  border-color: #00e676; \/<em> Kabul edilebilir dosya s\u00fcr\u00fcklenirken ye\u015fil <\/em>\/\n}\n\n.dropzone.reject {\n  border-color: #ff1744; \/<em> Kabul edilemez dosya s\u00fcr\u00fcklenirken k\u0131rm\u0131z\u0131 <\/em>\/\n}\n\naside ul {\n  list-style: none;\n  padding: 0;\n  margin-top: 20px;\n  text-align: left;\n}\n\naside li {\n  display: flex;\n  align-items: center;\n  justify-content: space-between; \/<em> Buton sa\u011fa hizal\u0131 <\/em>\/\n  margin-bottom: 10px;\n  padding: 10px;\n  border: 1px solid #eee;\n  border-radius: 4px;\n  background-color: #f9f9f9;\n}\n\naside li button {\n  background-color: #ff4d4d;\n  color: white;\n  border: none;\n  border-radius: 50%;\n  width: 24px;\n  height: 24px;\n  cursor: pointer;\n  font-weight: bold;\n  font-size: 0.8em;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-left: 10px;\n}<\/code><\/pre>\n<p>Bu g\u00fcncellemelerle, kullan\u0131c\u0131lar dosya t\u00fcr\u00fc, boyutu veya say\u0131s\u0131 gibi kriterlere uymayan dosyalar\u0131 s\u00fcr\u00fcklediklerinde g\u00f6rsel geri bildirim alacaklar. Ayr\u0131ca, kabul edilen dosyalar i\u00e7in bir \u00f6nizleme ve kald\u0131rma butonu da ekledik. <code>isDragAccept<\/code> ve <code>isDragReject<\/code> gibi \u00f6zellikler, s\u00fcr\u00fckleme an\u0131nda farkl\u0131 stiller uygulayarak kullan\u0131c\u0131ya an\u0131nda geri bildirim sa\u011flamak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>Ad\u0131m 2: Birden Fazla Dosya Y\u00f6netimi ve \u00d6nizlemeler<\/h4>\n<p><code>react-dropzone<\/code> varsay\u0131lan olarak birden fazla dosya y\u00fcklemeyi destekler. <code>onDrop<\/code> callback&#8217;i, kabul edilen dosyalar\u0131 bir dizi olarak al\u0131r. Yukar\u0131daki \u00f6rnekte, bu diziyi <code>acceptedFiles<\/code> durumuna ekleyerek birden fazla dosyan\u0131n listelenmesini ve \u00f6nizlenmesini sa\u011flad\u0131k.<\/p>\n<p>Resim \u00f6nizlemeleri i\u00e7in <code>URL.createObjectURL(file)<\/code> kulland\u0131k. Bu fonksiyon, taray\u0131c\u0131da ge\u00e7ici bir URL olu\u015fturur ve bu URL, dosyan\u0131n i\u00e7eri\u011fini temsil eder. Bu URL&#8217;ler, bile\u015fen render edildi\u011finde <code><img decoding=\"async\" src=\"...\" \/><\/code> etiketlerinde kullan\u0131labilir. Ancak, bu URL&#8217;ler taray\u0131c\u0131n\u0131n belle\u011finde yer kaplar ve bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda veya dosya art\u0131k gerekli olmad\u0131\u011f\u0131nda manuel olarak temizlenmeleri gerekir. Bunu <code>URL.revokeObjectURL(file.preview)<\/code> ile yapar\u0131z. <code>useEffect<\/code> hook&#8217;u i\u00e7inde bu temizleme i\u015flemini ger\u00e7ekle\u015ftirmek, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemenin en iyi yoludur.<\/p>\n<pre><code class=\"language-jsx\">\/\/ useEffect hook'u i\u00e7inde bellek temizleme\nuseEffect(() => {\n  \/\/ Bile\u015fen unmount edildi\u011finde veya acceptedFiles de\u011fi\u015fti\u011finde\n  \/\/ \u00f6nceki t\u00fcm \u00f6nizleme URL'lerini iptal et\n  return () => acceptedFiles.forEach(file => URL.revokeObjectURL(file.preview));\n}, [acceptedFiles]); \/\/ acceptedFiles de\u011fi\u015fti\u011finde tekrar \u00e7al\u0131\u015ft\u0131r<\/code><\/pre>\n<p>Bu, her yeni dosya y\u00fcklendi\u011finde veya mevcut dosyalar de\u011fi\u015fti\u011finde, \u00f6nceki \u00f6nizleme URL&#8217;lerinin temizlenmesini ve sadece mevcut olanlar\u0131n bellekte kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Ad\u0131m 3: Y\u00fckleme Durumu ve \u0130lerleme \u00c7ubu\u011fu (Sunucu Entegrasyonu \u0130\u00e7in)<\/h4>\n<p>Ger\u00e7ek bir uygulamada, dosyalar\u0131 sunucuya g\u00f6ndermeniz gerekecektir. Bu i\u015flem genellikle asenkron oldu\u011fundan, kullan\u0131c\u0131lara y\u00fckleme durumu hakk\u0131nda geri bildirim sa\u011flamak \u00f6nemlidir. <code>react-dropzone<\/code> do\u011frudan bir y\u00fckleme ilerleme \u00e7ubu\u011fu sa\u011flamaz, ancak se\u00e7ilen dosyalar\u0131 ald\u0131ktan sonra kendi y\u00fckleme mant\u0131\u011f\u0131n\u0131z\u0131 entegre edebilirsiniz.<\/p>\n<p>Dosyalar\u0131 sunucuya g\u00f6ndermek i\u00e7in genellikle <code>FormData<\/code> objesi ve <code>fetch<\/code> API&#8217;si veya <code>axios<\/code> gibi bir HTTP k\u00fct\u00fcphanesi kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\/\/ FileUploader.jsx i\u00e7inde, yeni bir fonksiyon ekleyelim\nconst uploadFiles = async () => {\n  if (acceptedFiles.length === 0) {\n    alert(\"L\u00fctfen y\u00fcklenecek dosya se\u00e7in.\");\n    return;\n  }\n\n  const formData = new FormData();\n  acceptedFiles.forEach(file => {\n    formData.append('files', file); \/\/ 'files' sunucu taraf\u0131nda beklenen alan ad\u0131\n  });\n\n  \/\/ Y\u00fckleme durumunu y\u00f6netmek i\u00e7in state ekleyebiliriz\n  \/\/ const [uploading, setUploading] = useState(false);\n  \/\/ const [uploadProgress, setUploadProgress] = useState(0);\n  \/\/ const [uploadError, setUploadError] = useState(null);\n\n  \/\/ setUploading(true);\n  \/\/ setUploadProgress(0);\n  \/\/ setUploadError(null);\n\n  try {\n    const response = await fetch('YOUR_UPLOAD_ENDPOINT', { \/\/ Sunucu taraf\u0131 API URL'si\n      method: 'POST',\n      body: formData,\n      \/\/ \u0130lerleme \u00e7ubu\u011fu i\u00e7in onUploadProgress (sadece axios ile m\u00fcmk\u00fcn)\n      \/\/ onUploadProgress: (progressEvent) => {\n      \/\/   const percentCompleted = Math.round((progressEvent.loaded * 100) \/ progressEvent.total);\n      \/\/   setUploadProgress(percentCompleted);\n      \/\/ }\n    });\n\n    if (!response.ok) {\n      throw new Error(<code>HTTP error! status: ${response.status}<\/code>);\n    }\n\n    const result = await response.json();\n    console.log('Dosyalar ba\u015far\u0131yla y\u00fcklendi:', result);\n    alert('Dosyalar ba\u015far\u0131yla y\u00fcklendi!');\n    setAcceptedFiles([]); \/\/ Y\u00fckleme sonras\u0131 listeyi temizle\n    setFileRejections([]);\n  } catch (error) {\n    console.error('Dosya y\u00fckleme hatas\u0131:', error);\n    \/\/ setUploadError(error.message);\n    alert('Dosya y\u00fcklenirken bir hata olu\u015ftu: ' + error.message);\n  } finally {\n    \/\/ setUploading(false);\n  }\n};<\/code><\/pre>\n<p>Ve <code>return<\/code> blo\u011funda bir y\u00fckleme butonu ekleyebiliriz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ FileUploader.jsx return blo\u011fu i\u00e7inde\n\/\/ ... (dropzone alan\u0131 ve dosya listeleri) ...\n\n{acceptedFiles.length > 0 && (\n  <button onClick={uploadFiles} className=\"upload-button\">\n    Dosyalar\u0131 Y\u00fckle\n  <\/button>\n)}<\/code><\/pre>\n<p>Ve stil:<\/p>\n<pre><code class=\"language-css\">\/<em> src\/App.css <\/em>\/\n\/<em> ... \u00f6nceki stiller ... <\/em>\/\n\n.upload-button {\n  background-color: #4CAF50; \/<em> Ye\u015fil <\/em>\/\n  color: white;\n  padding: 10px 20px;\n  border: none;\n  border-radius: 5px;\n  cursor: pointer;\n  font-size: 16px;\n  margin-top: 20px;\n  transition: background-color 0.3s ease;\n}\n\n.upload-button:hover {\n  background-color: #45a049;\n}<\/code><\/pre>\n<p>Bu \u00f6rnek, dosyalar\u0131 sunucuya nas\u0131l g\u00f6nderece\u011finize dair temel bir yap\u0131 sa\u011flar. Ger\u00e7ek bir uygulamada, <code>uploading<\/code>, <code>uploadProgress<\/code>, <code>uploadError<\/code> gibi durum de\u011fi\u015fkenlerini kullanarak kullan\u0131c\u0131lara daha detayl\u0131 geri bildirim sa\u011flayabilirsiniz. <code>axios<\/code> gibi k\u00fct\u00fcphaneler, <code>onUploadProgress<\/code> gibi \u00f6zelliklerle ilerleme \u00e7ubu\u011fu entegrasyonunu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Ad\u0131m 4: Geli\u015fmi\u015f Stil ve Kullan\u0131c\u0131 Deneyimi<\/h4>\n<p><code>react-dropzone<\/code>, stil konusunda tam esneklik sunar. <code>getRootProps<\/code> ve <code>getInputProps<\/code> taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen \u00f6zellikler (\u00f6rne\u011fin <code>className<\/code>, <code>style<\/code>), do\u011frudan HTML elemanlar\u0131n\u0131za uygulanabilir. Bu, dropzone alan\u0131n\u0131 uygulaman\u0131z\u0131n tasar\u0131m\u0131na m\u00fckemmel bir \u015fekilde uydurman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Yukar\u0131daki \u00f6rneklerde <code>isDragActive<\/code>, <code>isDragAccept<\/code>, <code>isDragReject<\/code> gibi boolean de\u011ferleri kullanarak s\u00fcr\u00fckleme durumu de\u011fi\u015ftik\u00e7e dropzone alan\u0131n\u0131n stilini dinamik olarak de\u011fi\u015ftirdik. Bu, kullan\u0131c\u0131lara hangi dosya t\u00fcrlerinin kabul edildi\u011fi veya bir dosyan\u0131n b\u0131rak\u0131lmaya haz\u0131r olup olmad\u0131\u011f\u0131 hakk\u0131nda an\u0131nda g\u00f6rsel geri bildirim sa\u011flar.<\/p>\n<p><strong>\u00d6rnek Stil \u0130yile\u015ftirmeleri:<\/strong><\/p>\n<p>*   <strong>Hover Efektleri:<\/strong> <code>dropzone:hover<\/code> CSS kural\u0131 ile fare \u00fczerine geldi\u011finde kenarl\u0131k veya arka plan rengini de\u011fi\u015ftirebilirsiniz.<br \/>\n*   <strong>\u0130konlar:<\/strong> Dropzone alan\u0131na bir bulut veya ok ikonu ekleyerek g\u00f6rsel \u00e7ekicili\u011fi art\u0131rabilirsiniz.<br \/>\n*   <strong>Metin De\u011fi\u015fiklikleri:<\/strong> <code>isDragActive<\/code> durumuna g\u00f6re metni &#8220;Dosyalar\u0131 buraya b\u0131rak\u0131n&#8230;&#8221; veya &#8220;Dosyalar\u0131 s\u00fcr\u00fckleyin&#8230;&#8221; \u015feklinde de\u011fi\u015ftirmek, kullan\u0131c\u0131ya net talimatlar verir.<br \/>\n*   <strong>Dosya \u00d6nizlemeleri:<\/strong> Resimler i\u00e7in k\u00fc\u00e7\u00fck \u00f6nizlemeler, kullan\u0131c\u0131lar\u0131n do\u011fru dosyalar\u0131 se\u00e7ti\u011finden emin olmalar\u0131na yard\u0131mc\u0131 olur. Video veya PDF gibi di\u011fer dosya t\u00fcrleri i\u00e7in de benzer \u015fekilde \u00f6nizlemeler (thumbnail veya ikon) g\u00f6sterebilirsiniz.<\/p>\n<h3>Sunucu Taraf\u0131 Entegrasyonu Hakk\u0131nda K\u0131sa Bir Not<\/h3>\n<p>Bu makale <code>react-dropzone<\/code> ile istemci taraf\u0131 dosya y\u00fcklemeye odaklan\u0131rken, dosyalar\u0131n kal\u0131c\u0131 olarak saklanmas\u0131 i\u00e7in bir sunucu taraf\u0131na ihtiyac\u0131n\u0131z olaca\u011f\u0131n\u0131 unutmay\u0131n. Sunucu taraf\u0131nda dosya i\u015fleme i\u00e7in kullan\u0131lan pop\u00fcler teknolojiler \u015funlard\u0131r:<\/p>\n<p>*   <strong>Node.js:<\/strong> <code>multer<\/code> veya <code>formidable<\/code> gibi middleware&#8217;ler ile.<br \/>\n*   <strong>Python:<\/strong> <code>Flask<\/code> veya <code>Django<\/code> \u00e7er\u00e7evelerinde <code>request.files<\/code> ile.<br \/>\n*   <strong>PHP:<\/strong> <code>$_FILES<\/code> s\u00fcper global dizisi ile.<br \/>\n*   <strong>Java:<\/strong> <code>Spring Boot<\/code>&#8216;ta <code>MultipartFile<\/code> ile.<\/p>\n<p>Sunucu taraf\u0131nda, y\u00fcklenen dosyalar\u0131n g\u00fcvenli\u011fini sa\u011flamak i\u00e7in dosya t\u00fcr\u00fc, boyutu ve i\u00e7eri\u011fi gibi do\u011frulamalar\u0131 tekrar yapman\u0131z \u00f6nemlidir. \u0130stemci taraf\u0131 do\u011frulamalar kullan\u0131c\u0131 deneyimi i\u00e7in harikad\u0131r, ancak g\u00fcvenlik i\u00e7in asla tek ba\u015f\u0131na yeterli de\u011fildir.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p><code>react-dropzone<\/code> ile \u00e7al\u0131\u015f\u0131rken g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken baz\u0131 en iyi uygulamalar ve ipu\u00e7lar\u0131:<\/p>\n<p>1.  <strong>Kullan\u0131c\u0131 Geri Bildirimi:<\/strong> Kullan\u0131c\u0131lara her ad\u0131mda net geri bildirim sa\u011flay\u0131n. Dosyalar s\u00fcr\u00fcklenirken, kabul edildi\u011finde, reddedildi\u011finde veya y\u00fcklenirken g\u00f6rsel ipu\u00e7lar\u0131 ve metin mesajlar\u0131 kullan\u0131n.<br \/>\n2.  <strong>Bellek Y\u00f6netimi:<\/strong> <code>URL.createObjectURL<\/code> kullan\u0131yorsan\u0131z, <code>URL.revokeObjectURL<\/code> ile olu\u015fturulan URL&#8217;leri temizlemeyi unutmay\u0131n. \u00d6zellikle \u00e7ok say\u0131da dosya \u00f6nizlemesi olu\u015fturuyorsan\u0131z bu kritik \u00f6neme sahiptir.<br \/>\n3.  <strong>Hata Y\u00f6netimi:<\/strong> Dosya reddedildi\u011finde veya sunucuya y\u00fcklenirken bir hata olu\u015ftu\u011funda, kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r hata mesajlar\u0131 g\u00f6sterin. <code>fileRejections<\/code> dizisi, bu hata mesajlar\u0131n\u0131 g\u00f6stermek i\u00e7in m\u00fckemmel bir kaynakt\u0131r.<br \/>\n4.  <strong>Eri\u015filebilirlik (Accessibility):<\/strong> <code>react-dropzone<\/code>&#8216;un kendisi eri\u015filebilirlik konusunda iyi bir temel sa\u011flar (<code>getInputProps<\/code> ile <code>tabIndex<\/code>, <code>aria-label<\/code> gibi \u00f6zellikleri y\u00f6netir). Ancak, kendi stil ve i\u00e7erik eklemelerinizle eri\u015filebilirli\u011fi bozmad\u0131\u011f\u0131n\u0131zdan emin olun. Klavye ile etkile\u015fimin m\u00fcmk\u00fcn oldu\u011fundan emin olun.<br \/>\n5.  <strong>Sunucu Taraf\u0131 Do\u011frulama:<\/strong> \u0130stemci taraf\u0131 do\u011frulamalar kullan\u0131c\u0131 deneyimi i\u00e7in harika olsa da, g\u00fcvenlik i\u00e7in her zaman sunucu taraf\u0131 do\u011frulamalar yap\u0131n. K\u00f6t\u00fc niyetli kullan\u0131c\u0131lar istemci taraf\u0131 kontrolleri atlayabilir.<br \/>\n6.  <strong>Performans:<\/strong> \u00c7ok b\u00fcy\u00fck dosyalar veya \u00e7ok say\u0131da dosya y\u00fcklerken performans sorunlar\u0131 ya\u015fayabilirsiniz. B\u00fcy\u00fck dosyalar i\u00e7in &#8220;par\u00e7alara ay\u0131rma&#8221; (chunking) ve birden fazla paralel istek g\u00f6nderme gibi stratejileri d\u00fc\u015f\u00fcnebilirsiniz. \u00d6nizlemeleri optimize etmek (\u00f6rne\u011fin, \u00e7ok b\u00fcy\u00fck resimlerin k\u00fc\u00e7\u00fck boyutlu \u00f6nizlemelerini olu\u015fturmak) de performans\u0131 art\u0131rabilir.<br \/>\n7.  <strong>Esneklik:<\/strong> <code>react-dropzone<\/code>&#8216;un esnek API&#8217;si sayesinde, \u00f6zel durumlar i\u00e7in kendi mant\u0131\u011f\u0131n\u0131z\u0131 kolayca entegre edebilirsiniz. \u00d6rne\u011fin, dosya t\u00fcr\u00fcne g\u00f6re farkl\u0131 \u00f6nizleme bile\u015fenleri render edebilir veya \u00f6zel bir do\u011frulama mant\u0131\u011f\u0131 uygulayabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>react-dropzone<\/code>, React uygulamalar\u0131n\u0131zda s\u00fcr\u00fckle ve b\u0131rak dosya y\u00fckleme i\u015flevselli\u011fini implemente etmenin en g\u00fc\u00e7l\u00fc ve esnek yollar\u0131ndan biridir. Bu makalede, temel kurulumdan geli\u015fmi\u015f dosya do\u011frulama, \u00f6nizlemeler ve sunucu entegrasyonuna kadar geni\u015f bir yelpazede <code>react-dropzone<\/code> kullan\u0131m\u0131n\u0131 \u00f6\u011frendik.<\/p>\n<p><code>useDropzone<\/code> hook&#8217;u sayesinde, karma\u015f\u0131k taray\u0131c\u0131 API&#8217;leri ile u\u011fra\u015fmak zorunda kalmadan, birka\u00e7 sat\u0131r kodla modern ve kullan\u0131c\u0131 dostu bir dosya y\u00fckleme aray\u00fcz\u00fc olu\u015fturabilirsiniz. <code>accept<\/code>, <code>maxSize<\/code>, <code>maxFiles<\/code> gibi opsiyonlar ve <code>isDragActive<\/code>, <code>isDragAccept<\/code>, <code>isDragReject<\/code> gibi durum de\u011fi\u015fkenleri, uygulaman\u0131za zengin bir kullan\u0131c\u0131 deneyimi katman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Unutmay\u0131n ki etkili bir dosya y\u00fckleme deneyimi, sadece istemci taraf\u0131nda iyi bir aray\u00fcze sahip olmakla kalmaz, ayn\u0131 zamanda g\u00fc\u00e7l\u00fc sunucu taraf\u0131 entegrasyonu, kapsaml\u0131 hata y\u00f6netimi ve g\u00fcvenlik \u00f6nlemleri gerektirir. <code>react-dropzone<\/code> size bu yolculukta g\u00fc\u00e7l\u00fc bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. \u015eimdi kendi React projelerinizde bu bilgileri kullanarak harika dosya y\u00fckleme bile\u015fenleri olu\u015fturmaya haz\u0131rs\u0131n\u0131z!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?\nReact uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131 deneyimini do\u011fru","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-30804","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React&#039;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React&#039;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"React&#039;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? React uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131 deneyimini do\u011fru\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-02T05:41:09+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?\",\"datePublished\":\"2025-10-02T05:41:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\"},\"wordCount\":2323,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\",\"name\":\"React'ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-02T05:41:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React'ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/","og_locale":"tr_TR","og_type":"article","og_title":"React'ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?","og_description":"React'ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? React uygulamalar\u0131nda dosya y\u00fckleme, kullan\u0131c\u0131 deneyimini do\u011fru","og_url":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-02T05:41:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?","datePublished":"2025-10-02T05:41:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/"},"wordCount":2323,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/","url":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/","name":"React'ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-02T05:41:09+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/reactta-react-dropzone-ile-surukle-ve-birak-dosya-yukleme-nasil-yapilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React&#8217;ta react-dropzone ile S\u00fcr\u00fckle ve B\u0131rak Dosya Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30804"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30804\/revisions"}],"predecessor-version":[{"id":30805,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30804\/revisions\/30805"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}