{"id":230275,"date":"2022-11-22T17:41:00","date_gmt":"2022-11-22T14:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230275"},"modified":"2022-11-22T20:54:00","modified_gmt":"2022-11-22T17:54:00","slug":"tiedostojen-lataaminen-wordpress-revisitedissae-osa-2-palvelinpuoli","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/tiedostojen-lataaminen-wordpress-revisitedissae-osa-2-palvelinpuoli\/","title":{"rendered":"Tiedostojen lataaminen WordPress Revisitediss\u00e4, osa 2 &#8211; Palvelinpuoli"},"content":{"rendered":"\n<p>Ennen kuin hypp\u00e4\u00e4n suoraan t\u00e4m\u00e4n koodiin, halusin mainita kaksi asiaa:<\/p>\n<ol>\n<li>Kyll\u00e4, olen k\u00e4sitellyt t\u00e4t\u00e4 v\u00e4h\u00e4n <strong><a href=\"https:\/\/tommcfarlin.com\/uploading-files-to-a-custom-directory\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aikaa sitten,<\/a><\/strong><\/li>\n<li>Ja t\u00e4m\u00e4 on kaksiosaisen sarjan toinen osa.<\/li>\n<\/ol>\n<p>Jos et ole lukenut <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/tiedostojen-lataaminen-wordpressiin-uudelleentarkastelu-osa-1-asiakaspuoli\/\" title=\"ensimm\u00e4ist\u00e4 osaa\">ensimm\u00e4ist\u00e4 osaa<\/a>, tee se ensin. Ajatuksena on, ett\u00e4 koodi toimii yhdess\u00e4 sen kanssa, mit\u00e4 aion k\u00e4sitell\u00e4 t\u00e4ss\u00e4 viestiss\u00e4 varmistaakseen, ett\u00e4 sek\u00e4 asiakas- ett\u00e4 palvelinpuoli on katettu.<\/p>\n<p>Loppujen lopuksi syy sen purkamiseen ei ole vain varmistaa, ett\u00e4 asiat tehd\u00e4\u00e4n oikein, vaan my\u00f6s varmistaa, ett\u00e4 k\u00e4ytt\u00e4j\u00e4ll\u00e4 on mahdollisimman positiivinen kokemus.<\/p>\n<p>N\u00e4in voit ladata tiedostoja WordPressiin palvelinpuolella.<\/p>\n<h2>Tiedostojen lataaminen WordPressiin palvelinpuolella<\/h2>\n<p>Huomaa, ett\u00e4 vaikka on olemassa joitain turvatarkastuksia, jotka voidaan \u2013 ja pit\u00e4isi \u2013 tehd\u00e4, en ole viel\u00e4 l\u00f6yt\u00e4nyt tapaa, joka olisi t\u00e4ysin idioottivarma sen havaitsemiseksi, ett\u00e4 ladattava tiedosto on oikean tyyppist\u00e4.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 on edelleen mahdollista, ett\u00e4 virheellinen tiedostotyyppi voidaan ladata. Se, onko t\u00e4m\u00e4 haitallinen vai ei, on tietysti loppuk\u00e4ytt\u00e4j\u00e4n p\u00e4\u00e4tett\u00e4viss\u00e4. Kerron vain t\u00e4m\u00e4n tehd\u00e4kseni selv\u00e4ksi, ett\u00e4 n\u00e4ytett\u00e4v\u00e4 koodi on niin hyv\u00e4 kuin voin tarjota, mutta ett\u00e4 sinun tulee silti k\u00e4ytt\u00e4\u00e4 harkintavaltaa.<\/p>\n<p>Ehk\u00e4 kannattaa jopa etsi\u00e4 kolmannen osapuolen kirjastoa bin\u00e4\u00e4ritietojen validoimiseksi, kun ne on vastaanotettu. Mutta poikkean.<\/p>\n<h3>1 Tarkista k\u00e4ytt\u00e4jien k\u00e4ytt\u00f6oikeudet<\/h3>\n<p>Muista, ett\u00e4 aina kun olemme luoneet k\u00e4ytt\u00f6liittym\u00e4n, WordPressin on luotava nonce, jotta voimme varmistaa t\u00e4m\u00e4n avulla, ett\u00e4 k\u00e4ytt\u00e4j\u00e4ll\u00e4 on lupa ladata tiedosto.<\/p>\n<p>Noncen tarkistamisen lis\u00e4ksi haluan tarkistaa useita muita asioita, jotka kaikki on k\u00e4\u00e4ritty menetelm\u00e4\u00e4n nimelt\u00e4 <strong>userCanSave<\/strong>.<\/p>\n<p>Muista ensin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-00-nonce-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00e4ytt\u00f6liittym\u00e4:<\/a><\/strong><\/p>\n<pre><code>&lt;form method=\"post\"\n      enctype=\"multipart\/form-data\"\n      action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n    &lt;!-- Snip For Brevity ---&gt;\n    &lt;?php\n    wp_nonce_field(\n        'acme-item-upload',\n        'acme-item-importer'\n    );\n    ?&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>Katso sitten, kuinka k\u00e4yt\u00e4n sit\u00e4 koodissa. Ensin <strong>m\u00e4\u00e4rit\u00e4n userCanSave- <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-usercansave-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktion<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Determines if the current user has permission to upload a file based on their current role and the values\n * of the security nonce.\n *\n * @param  string $nonce     The WordPress-generated nonce.\n * @param  string $action    The developer-generated action name.\n * @return bool              True if the user has permission to save; otherwise, false.\n *\/\nprivate function userCanSave($nonce, $action)\n{\n    $isNonceSet   = isset($_POST[$nonce]);\n    $isValidNonce = false;\n\n    if ($isNonceSet) {\n        $isValidNonce = wp_verify_nonce($_POST[$nonce], $action);\n    }\n\n    return ($isNonceSet &amp;&amp; $isValidNonce);\n}\n<\/code><\/pre>\n<p>Ja sitten kutsun t\u00e4t\u00e4 yksinkertaisesti prosessin alussa. Jos se ep\u00e4onnistuu, palaan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-save-part1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takaisin<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assuming the user has permission, verifies the security nonce and uploads the PDF file to the `uploads`\n * directory and the Media Library.\n *\/\npublic function save()\n{\n  if (!$this-&gt;userCanSave('acme-item-importer', 'acme-item-upload')) {\n    return;\n  }\n\n  \/\/ More to come...\n\n}\n<\/code><\/pre>\n<p>Suosittelen virheilmoituksen n\u00e4ytt\u00e4mist\u00e4, mutta poikkean t\u00e4st\u00e4 asiasta, koska viestiss\u00e4 on joitain tapoja tehd\u00e4 t\u00e4m\u00e4.<\/p>\n<h3>2 Lataa tiedosto<\/h3>\n<p>Olettaen, ett\u00e4 k\u00e4ytt\u00e4j\u00e4ll\u00e4 on oikeus tarkistaa tiedosto, tiedoston lataaminen on turvallista. Prosessi t\u00e4m\u00e4n tekemiseksi on yksinkertaista, mutta vaatii silti hieman ty\u00f6t\u00e4 WordPress API:n (eli <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_upload_bits\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_upload_bits-<\/a> funktion) kanssa.<\/p>\n<p>Ensin tiedosto t\u00e4ytyy napata PHP:n <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.files.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_FILES<\/a> globaalista tiedostosta ja ladata sitten. Kun teet niin, on kuitenkin t\u00e4rke\u00e4\u00e4 varmistaa, ett\u00e4 lataat tiedoston <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-02-save-part2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oikealla tiedostotunnisteella<\/a><\/strong> (ainakin).<\/p>\n<pre><code>&lt;?php\n\n$file_type = explode('.', $filename);\n$file_type = strtolower($file_type[count($file_type) - 1]);\nif ('pdf' !== $file_type) {\n  \/\/ Give your feedback of choice here.\n}\n<\/code><\/pre>\n<p>Jos tiedostotyyppi ei ole PDF, voit tehd\u00e4 virheilmoituksen, palauttaa sen (vaikka en ole t\u00e4m\u00e4n fani) tai <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-03-save-part3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">antaa k\u00e4ytt\u00e4j\u00e4lle palautetta<\/a><\/strong> (mit\u00e4 min\u00e4 pid\u00e4n).<\/p>\n<pre><code>&lt;?php\n\nif ($uploadFile['error']) {\n  \/\/ Your preferred method of feedback here.\n}<\/code><\/pre>\n<p>Viimeinen vaihe on kuitenkin tiedoston saaminen median latausohjelmaan.<\/p>\n<h3>3 Lataaminen Media Uploader -laitteeseen<\/h3>\n<p>Viimeinen vaihe kaikessa t\u00e4ss\u00e4 on tiedoston saaminen median latausohjelmaan. T\u00e4t\u00e4 varten tarvitset useita asioita WordPress-ytimest\u00e4:<\/p>\n<ol>\n<li>tiedosto.php-kirjasto,<\/li>\n<li>liitetiedosto, joka tarvitaan kertomaan WordPressille, mit\u00e4 lis\u00e4t\u00e4\u00e4n,<\/li>\n<li>WordPress API -toiminto, <strong>wp_insert_attachment<\/strong><\/li>\n<li>ohjataan takaisin kutsuvalle sivulle<\/li>\n<\/ol>\n<p>Kuulostaa paljon, eik\u00f6? Se ei ole liian huono.<\/p>\n<p>Yleens\u00e4 ryhmittelen WordPress-tiedostokirjaston ja <strong>wp_insert_attachmentin<\/strong> sis\u00e4llytt\u00e4misen yhdeksi lohkoksi.<\/p>\n<p>Huomaat, ett\u00e4 asetan MIME-tyypiksi <strong>pdf<\/strong> ja varmistan, ett\u00e4 otsikko ei sis\u00e4ll\u00e4 mit\u00e4\u00e4n muuta kuin tiedoston nime\u00e4. T\u00e4m\u00e4n j\u00e4lkeen lataan tiedoston mediakirjastoon k\u00e4ytt\u00e4m\u00e4ll\u00e4 <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_insert_attachment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_insert_attachment -ohjelmaa.<\/a><\/p>\n<\/p>\n<p>Sen t\u00e4ydellinen koodi on <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-05-save-part5-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraava:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nrequire_once(ABSPATH. \"wp-admin\". '\/includes\/file.php');\n$attachment  = array(\n    'post_mime_type' =&gt; 'pdf',\n    'post_title'     =&gt; preg_replace('\/.[^.]+$\/', '', $filename),\n    'post_status'    =&gt; 'inherit'\n);\n$attachment_id = wp_insert_attachment($attachment, $uploadFile['file']);\n<\/code><\/pre>\n<p>T\u00e4m\u00e4n j\u00e4lkeen ohjaan takaisin sivulle, joka aloitti t\u00e4m\u00e4n kaiken (joka on yleens\u00e4 admin-sivu, jonka n\u00e4imme edellisess\u00e4 viestiss\u00e4. T\u00e4t\u00e4 varten nappaan <strong>_wp_http_refererin<\/strong> PHP:n <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST<\/a> &#8211; taulukosta.<\/p>\n<pre><code>&lt;?php\nwp_safe_redirect(\n    $_REQUEST['_wp_http_referer'],\n    301\n);\nexit;\n<\/code><\/pre>\n<p>Ja se <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-06-save-part6-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ohjaa<\/a> k\u00e4ytt\u00e4j\u00e4n takaisin sivulle, josta h\u00e4n tuli.<\/p>\n<h2>Ja tiedosto on ladattu<\/h2>\n<p>T\u00e4ss\u00e4 vaiheessa olemme p\u00e4\u00e4tt\u00e4neet, mit\u00e4 haluamme tehd\u00e4:<\/p>\n<ol>\n<li>Tarjoa kunnollinen asiakaskokemus,<\/li>\n<li>Ladattu tiedosto mediakirjastoon (mahdollisuudella antaa palautetta)<\/li>\n<li>Ja ohjattiin takaisin sivulle, josta kaikki alkoi.<\/li>\n<\/ol>\n<p>My\u00f6nnett\u00e4k\u00f6\u00f6n, ett\u00e4 t\u00e4ss\u00e4 on paljon tilaa palautteelle, ja kehotan sinua muokkaamaan t\u00e4t\u00e4 koodisi tarpeen mukaan, mutta tarvitsemasi perusteet tulisi antaa sek\u00e4 <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/tiedostojen-lataaminen-wordpressiin-uudelleentarkastelu-osa-1-asiakaspuoli\/\" title=\"edellisess\u00e4 viestiss\u00e4\">edellisess\u00e4 viestiss\u00e4<\/a> ett\u00e4 t\u00e4ss\u00e4 viestiss\u00e4.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esimerkki palvelinpuolen koodista, joka tarvitaan tiedoston lataamiseen WordPressin (ja Media Uploaderin) kautta.<\/p>\n","protected":false},"author":1,"featured_media":164785,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[895,843,864],"tags":[1166],"class_list":["post-230275","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koodi","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230275","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230275"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230275\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164785"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230275"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}