---
title: "Menulis sistem penyimpanan disesuaikan"
version: 1.9
locale: id
source: https://docs.djangoproject.com/id/1.9/howto/custom-file-storage/
canonical: https://djangodocs.dev/id/1.9/howto/custom-file-storage/
---
# Menulis sistem penyimpanan disesuaikan

Jika anda butuh untuk menyediakan penyimpanan berkas disesuaikan -- contoh umum adalah menyimpan berkas di beberapa sistem terpencil -- anda dapat melakukannya dengan menentukan kelas penyimpanan disesuaikan. Anda akan butuh mengikuti langkah-langkah ini:

1. Sistem penyimpanan disesuaikan anda harus subkelas dari `django.core.files.storage.Storage`:

   ```
   from django.core.files.storage import Storage

   class MyStorage(Storage):
       ...
   ```
2. Django harus dapat memberikan contoh sistem penyimanan disesuaikan anda tanpa argumen apapun. Ini berarti bahwa setiap pengaturan harus diambil dari  `django.conf.settings`:

   ```
   from django.conf import settings
   from django.core.files.storage import Storage

   class MyStorage(Storage):
       def __init__(self, option=None):
           if not option:
               option = settings.CUSTOM_STORAGE_OPTIONS
           ...
   ```
3. Kelas penyimpanan anda harus menerapkan cara [`_open()`](#django.core.files.storage._open) dan [`_save()`](#django.core.files.storage._save) , bersama dengan cara lainnya sesuai pada kelas penyimpanan anda. Lihat dibawah untuk lebih pada cara ini.

   Sebagai tambahan, jika kelas anda menyediakan penyimpanan berkas lokal, itu harus mengesampingkan cara `path()`.
4. Kelas penyimpanan anda harus [deconstructible](/id/1.9/topics/migrations/#custom-deconstruct-method) sehingga dia dapat di serialkan ketika digunakan pada bidang dalam sebuah perpindahan. Selama bidang anda mempunyai argumen yang mereka sendiri [serializable](/id/1.9/topics/migrations/#migration-serializing), anda dapat menggunakan kelas decorator untuk ini (itu mengapa Django digunakan pada FileSystemStorage).

Secara awal, cara ini menimbulkan NotImplementedError dan akan secara khusus harus dikesampingkan:

- [`Storage.delete()`](/id/1.9/ref/files/storage/#django.core.files.storage.Storage.delete)
- [`Storage.exists()`](/id/1.9/ref/files/storage/#django.core.files.storage.Storage.exists)
- [`Storage.listdir()`](/id/1.9/ref/files/storage/#django.core.files.storage.Storage.listdir)
- [`Storage.size()`](/id/1.9/ref/files/storage/#django.core.files.storage.Storage.size)
- [`Storage.url()`](/id/1.9/ref/files/storage/#django.core.files.storage.Storage.url)

Catat bagaimanapun bahwa tidak semua cara ini dibutuhkan dan mungkin sengaja dihilangkan. Ketika itu terjadi, itu memungkinkan meninggalkan setiap cara tidak diterapkan dan masih dapat Penyimpanan bekerja.

Sebagai contoh, jika daftar isi dari backend penyimpanan tertentu berubah menjadi mahal, anda mungkin memutuskan tidak menerapkan Storage.listdir.

Cara lain akan menjadi backend yang ahnya menangani penulisan ke berkas. Dalam kasus ini, anda tidak akan butuh menerapkan apapun cara diatas.

Akhirnya, cara mana yang anda terapkan terserah anda. Meninggalkan beberapa cara tidak diterapkan akan menghasilkan antarmuka sebagian (kemungkinan rusak).

Anda akan juga ingin menggunakan penghubung khususnya dirancang untuk obyek penyimpanan disesuaikan. Ini adalah:

#### `_open(name, mode='rb')`

**Wajib**.

Dipanggil oleh `Storage.open()`, ini adalah mekanisme sesungguhnya kelas penyimpanan digunakan untuk membuka berkas. Ini harus mengembalikan sebuah obyek `File`, meskipun dalam kebanyakan kasus, anda ingin mengembalikan beberapa subkelas disini yang menerapkan logika spesifik ke sistem penyimpanan belakang.

#### `_save(name, content)`

Dipanggil oleh `Storage.save()`, `name` sudah telah melalui `get_valid_name()` dan `get_available_name()`, dan `content` akan menjadi obyek `File` itu sendiri.

Harus mengembalikan nama sebenarnya dari nama dari berkas tersimpan (biasanya `name` disahkan, tetapi jika penyimpanan butuh merubah nama berkas mengembalikan nama baru sebagai gantinya).

#### `get_valid_name(name)`

Mengembalikan sebuah nama berkas yang cocok untuk digunakan dengan sistem penyimpanan pokok. Argumen `name` dilewati ke cara ini antara berkas nama asli dikirim ke peladen atau, jika `upload_to` adalah dapat dipanggil, nama berkas dikembalikan oleh cara tersebut setelah informasi jalur dipindahkan. Kesampingkan ini untuk menyesuaiakan bagaimana karakter bukan-standar dirubah ke nama berkas aman.

> **Changed in Django 1.9**
>
> Di versi lebih lama, cara ini tidak dipanggil ketika `upload_to` dapat dipanggil.

Kode disediakan di `Storage` hanya mempertahankan karakter alpanumerik, titik dan garis bawah dari nama berkas asli, memindahkan semua yang lainnya.

#### `get_available_name(name, max_length=None)`

Mengembalikan nama berkas yang tersedia di mekanisme penyimpanan, barangkali mengambil nama berkas tersedia ke dalam akun. argumen `name` dilewati ke cara ini akan sudah dibersihkan ke nama berkas sah untuk sistem penyimpanan, menurut cara `get_valid_name()` digambarkan diatas.

Panjang dari nama berkas tidak melebihi `max_length`, jika disediakan. Jika nama berkas unik bebas tidak dapat ditemukan, sebuah pengecualian [`SuspiciousFileOperation`](/id/1.9/ref/exceptions/#django.core.exceptions.SuspiciousOperation) muncul.

Jika sebuah berkas dengan `name` sudah ada, garis bawah ditambah 7 karakter acak alpanumerik string akan ditambahkan ke nama berkas sebelum tambahan.

> **Changed in Django 1.8**
>
> Argumen `max_length` telah ditambahkan.
