> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Mengunggah file lokal ke DingTalk Docs (Dokumen Saya)

> Panduan bagi developer untuk mengunggah file lokal ke direktori Dokumen Saya di DingTalk Docs — mencakup prasyarat, alur pengembangan, pembuatan aplikasi, dan konfigurasi web app.

Dokumen ini memandu Anda dalam mengunggah file lokal ke direktori Dokumen Saya di DingTalk Docs.

## Ikhtisar

### Apa yang akan Anda pelajari

Tutorial ini menunjukkan kepada developer cara mengunggah file lokal ke direktori Dokumen Saya di DingTalk Docs.

### Tujuan

Membantu developer menguasai dengan cepat cara mengunggah file lokal ke direktori Dokumen Saya di DingTalk Docs.

### Audiens

Semua developer DingTalk.

## Prasyarat

* Anda telah memperoleh izin developer.
* Anda telah menginstal IDE atau alat pengembangan lainnya.
* Anda telah menginstal [Node.js](https://nodejs.org/en/download) dan menyelesaikan [pengaturan environment](https://m.runoob.com/nodejs/nodejs-install-setup.html).
* Anda telah menginstal [Maven](https://maven.apache.org/) dan menyelesaikan [pengaturan environment](https://maven.apache.org/install.html).
* Anda telah menginstal [JDK](https://www.oracle.com/java/technologies/downloads/?er=221886) dan menyelesaikan [pengaturan environment](https://docs.oracle.com/en/java/javase/24/install/overview-jdk-installation.html).

## Alur kerja pengembangan

1. Panggil API [Get My Docs Knowledge Base information](/id/open/development/get-my-documents) untuk memperoleh ID node root dari Dokumen Saya, yaitu parameter respons `rootNodeId` (parentDentryUuid).
2. Panggil API [Get file upload information](/id/open/development/obtain-file-upload-informations) untuk memperoleh nilai parameter `resourceUrls` dan `headers` yang diperlukan untuk mengunggah file.
3. Unggah file menggunakan metode OSS header sign request:

   Java

   ```java lines theme={"theme":{"light":"github-light","dark":"github-dark"}}
   import java.io.*;
   import java.net.HttpURLConnection;
   import java.net.URL;
   public void test(){
                  // Ambil resourceUrls dari respons API
                   String resourceUrl = "resourceUrls returned by the API above";
                 // Ambil headers dari respons API
                   Map<String, String> headers = "headers returned by the API above";
                   URL url = new URL(resourceUrl);
                   HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                  if (headers != null) {
                   for (Map.Entry<String, String> entry : headers.entrySet()) {
                       connection.setRequestProperty(entry.getKey(), entry.getValue());
                   }
               }
                   connection.setDoOutput(true);
                   connection.setRequestMethod("PUT");
                   connection.setUseCaches(false);
                   connection.setReadTimeout(10000);
                   connection.setConnectTimeout(10000);
                   connection.connect();
                   OutputStream out = connection.getOutputStream();
                   InputStream is = new FileInputStream(new File("/Users/xxxxx/Desktop/test-file.xls"));
                   byte[] b =new byte[1024];
                   int temp;
                   while ((temp=is.read(b))!=-1){
                          out.write(b,0,temp);
                   }
                   out.flush();
                   out.close();
                   int responseCode = connection.getResponseCode();
                   connection.disconnect();
                   if (responseCode == 200) {
                       System.out.println("Upload succeeded");
                    } else {
                       System.out.println("Upload failed");
                    }
   }
   ```

   Python

   ```python lines theme={"theme":{"light":"github-light","dark":"github-dark"}}
   #!/usr/bin/env python

   import requests

   url = '<resourceUrl obtained from the API in step 1>'
   headers = <headers returned by the API in step 1>
   result = requests.put(url, data=open('<path_to_file>', 'rb'), headers=headers)
   print(result)
   ```

   C#

   ```java lines theme={"theme":{"light":"github-light","dark":"github-dark"}}
   public static string HttpRequest(string url, string filePath, Dictionary<string, string> headers) {

       FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
       BinaryReader reader = new BinaryReader(fileStream);
       reader.BaseStream.Seek(0, SeekOrigin.Begin);
       byte[] datas = reader.ReadBytes((int)reader.BaseStream.Length);
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
       request.Method = "PUT";
       request.Timeout = 150000;
       foreach (var header in headers) {
           request.Headers.Add($"{header.Key}", $"{header.Value}");
       }
       Stream requestStream = null;
       string responseStr = null;
       try {
           if (datas != null) {
               request.ContentLength = datas.Length;
               requestStream = request.GetRequestStream();
               requestStream.Write(datas, 0, datas.Length);
               requestStream.Close();
           } else {
               request.ContentLength = 0;
           }
           HttpWebResponse response = request.GetResponse() as HttpWebResponse;
           responseStr = response.Headers.GetValues("x-oss-request-id")[0];
       } catch (Exception ex) {
           Console.WriteLine("error");
       } finally {
           request = null;
           requestStream = null;
       }
       return responseStr;
   }
   ```

   PHP

   ```text lines theme={"theme":{"light":"github-light","dark":"github-dark"}}
   $url = $result->body->headerSignatureInfo->resourceUrls[0];
   $headersSource = $result->body->headerSignatureInfo->headers;
   foreach ($headersSource as $key => $value) {
   $headers[] = $key . ': ' . $value;
   }
   // Anda harus secara eksplisit mengatur content-type menjadi kosong
   $headers['Content-Type'] = '';

   $file = '/Users/dengxian.ldx/Desktop/test.txt';

   $ch = curl_init();
   curl_setopt_array($ch, array(
   CURLOPT_URL => $url,
   CURLOPT_RETURNTRANSFER => true,
   CURLOPT_HEADER => true,
   CURLOPT_TIMEOUT => 100,
   CURLOPT_CONNECTTIMEOUT => 100,
   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
   CURLOPT_PUT => true,
   CURLOPT_HTTPHEADER => $headers,
   CURLOPT_SSL_VERIFYPEER => false,
   CURLOPT_SSL_VERIFYHOST => false,
   ));
   curl_setopt($ch, CURLOPT_INFILE, fopen($file , 'rb'));
   curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file) );
   curl_setopt($ch, CURLOPT_UPLOAD, true);

   $response = curl_exec($ch);
   curl_close($ch);

   echo $response .PHP_EOL;
   ```

   Node.js

   ```javascript lines theme={"theme":{"light":"github-light","dark":"github-dark"}}
   const fs = require('fs');
   const request = require('request-promise');

   url = <url>;
   header = <headers>;

   // Catatan: Anda harus secara eksplisit mengatur content-type menjadi kosong
   headers['content-type']='';

   var options = {
     method: 'PUT',
     url: url,
     headers: headers
   };

   fs.createReadStream('/Users/dengxian.ldx/temp/test/a.txt').pipe(request(options)).then(body =>{
     console.log(body);
   }).catch(err => {
     console.log(err);
   });
   ```
4. Panggil API [Submit file](/id/open/development/submittal-file) untuk mengunggah file ke direktori Dokumen Saya di DingTalk Docs.

## Langkah 1: Buat aplikasi

1. Masuk ke [Developer Console](https://open-dev.dingtalk.io/#/).
2. Klik **App Development** > **Internal app** > **DingTalk App** > **Create App**.
3. Isi informasi aplikasi.

   | **Item**               | **Wajib** | **Deskripsi**                                                                                                                                          |
   | ---------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
   | **Nama aplikasi**      | Ya        | Masukkan nama aplikasi. Panjang minimal 2 karakter.                                                                                                    |
   | **Deskripsi aplikasi** | Ya        | Jelaskan secara singkat produk atau layanan yang disediakan aplikasi. Panjang minimal 4 karakter.                                                      |
   | **Ikon aplikasi**      | Tidak     | Unggah ikon aplikasi. Ikon harus dalam format JPG atau PNG, minimal 240 px \* 240 px, dengan rasio aspek 1:1, tanpa sudut membulat, dan maksimal 2 MB. |
4. Klik **Save** untuk masuk ke halaman detail aplikasi.

Setelah dibuat, klik **Basic Information** > **Credentials and Basic Information** untuk melihat Client ID dan Client Secret.

> *Catatan: Simpan Client ID dan Client Secret untuk digunakan nanti.*

## Langkah 2: Konfigurasikan web app

1. Pada halaman detail aplikasi, klik **App Capabilities** > **Add App Capability**.
2. Pilih untuk menambahkan web app.
3. Konfigurasikan informasi web app (H5):

   | **Item**     | **Deskripsi**                                                                                                                                           |
   | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
   | App home URL | Masukkan home URL. Contoh ini menggunakan: `http://localhost:5173?corpid=$CORPID$` untuk pengujian selanjutnya. Contoh ini hanya untuk pengujian lokal. |
   | PC home URL  |                                                                                                                                                         |

   Setelah konfigurasi, klik Save.

## Langkah 3: Minta izin API

1. Pada halaman detail aplikasi, klik **Development Configuration** > **Manage permissions** untuk masuk ke halaman permintaan izin.
2. Pada kotak pencarian izin, masukkan `Wiki.Workspace.Read`, `Storage.UploadInfo.Read`, dan `Storage.File.Write` secara terpisah, lalu minta setiap Izin API.

   > Jika Anda bukan Admin Organisasi atau tidak memiliki izin pengembangan aplikasi, permintaan izin memerlukan persetujuan dari Admin Organisasi.

## Langkah 4: Publikasikan aplikasi

1. Setelah mengonfigurasi aplikasi, publikasikan. Pada halaman detail aplikasi, klik **App Release** > **Version Management and Release**.
2. Klik **Create New Version** untuk masuk ke halaman detail versi.
3. Konfigurasikan informasi versi:

   | **Item**            | **Deskripsi**                                                              |
   | ------------------- | -------------------------------------------------------------------------- |
   | App version number  | Masukkan nomor versi aplikasi. Nilai default dapat diterima.               |
   | Version description | Masukkan deskripsi versi. Anda dapat menyesuaikannya.                      |
   | Content to publish  | Kapabilitas aplikasi yang ditampilkan di Workbench: <br /> - Pilih web app |

   Setelah konfigurasi, klik Save di bawah.
4. Pada dialog berhasil, klik Publish Directly.

   > *Jika Anda bukan Admin Organisasi, memublikasikan aplikasi memerlukan persetujuan dari Admin Organisasi. Memublikasikan hanya untuk diri sendiri tidak memerlukan persetujuan admin.*

## Langkah 5: Bangun layanan

1. Pastikan langkah-langkah di atas telah selesai dan Anda telah memperoleh parameter yang diperlukan untuk menjalankan demo di bawah ini.

2. Unduh demo [doc-demo.zip](https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250704/bpihcw/doc-demo.zip).

3. Buka IDE Anda dan impor demo yang telah diunduh.

   > Kode contoh dibagi menjadi backend (direktori kode backend) dan frontend (direktori kode frontend).

4. Buka direktori kode backend. Pada direktori resources, edit file `application.properties`, dan masukkan `clientId (app Client ID)` serta `clientSecret (app Client Secret)`.

5. Klik untuk memulai layanan backend.

   **Catatan**

   * Sebelum memulai layanan backend, pastikan Maven dan JDK telah terinstal dengan benar dan environment terkait telah dikonfigurasi. Jika Anda menginstal IDE untuk pertama kalinya, edit file konfigurasi terkait di IDE.
   * Pastikan port 5173 dan 8080 tidak sedang digunakan.

6. Buka direktori kode frontend, edit `vite.config.ts`, dan masukkan `clientId (app Client ID)` yang benar.

7. Klik kanan file proyek frontend dan pilih **Terminal** untuk membukanya.

8. Pada jendela terminal, jalankan perintah berikut:

   1. `npm install`
   2. `npm run dev`

      > Catatan: Pada Windows, gunakan `npm run dev:raw` saat memulai.

9. Layanan frontend dan backend kini berjalan dengan sukses.

## Langkah 6: Uji aplikasi

1. Masuk ke klien DingTalk dan pilih organisasi tempat aplikasi berada.

2. Klik **Workbench** > **Add**, cari aplikasi organisasi yang Anda buat di atas, lalu tambahkan.

3. Buka aplikasi di Workbench, lalu klik **Select Local File** untuk mengunggah.

   > File harus lebih kecil dari 50 MB.

4. Setelah memilih file, klik **Submit** untuk menyelesaikan pengunggahan.

5. Setelah pengunggahan selesai, buka file untuk melihat konten yang telah diunggah.
