9.2.0のrest apiによるファイルのアップロードについて

9.2.0を使用しています。
REST APIを用いて、PythonアプリからConcreteCMSへファイルをアップロードしたいのですが、下記コードにて、<Response [400]>のエラーが返されてしまいます。

tokenは、下記コードを実行する前に、Scopeを files:addでpassword Credentialを用いて取得しています。

どの様に記述すればよいか教えて頂けないでしょうか。

import requests
import pathlib

token_file_path = pathlib.Path(“./token_for_uploading.txt”)
with open(token_file_path) as f:
token = f.read()

get_url = “http://********.com/concrete5/ccm/api/1.0/files”
head = {‘Content-Type’: ‘multipart/form-data’,‘Authorization’: ‘Bearer {}’.format(token)}

pdf_file = open(‘./API_TEST1.pdf’,‘rb’).read()
folder = 6829
folder_data = {‘folder’: folder}
upfile = {‘file’: (‘API_TEST1.pdf’, pdf_file, ‘application/pdf’)}

upload_result = requests.post(get_url,headers=head,data=folder_data,files=upfile)
print(upload_result)

@TatsumaK 投稿ありがとうございます!

すいません。file をアップロードするエンドポイントは使ったことがなかったので、
僕の方でも試してみました。

エラーが出ているのですが、これは僕の環境に依存しているのか否かがわからないのでもうちょっと調べます。


そもそもなんですが、Concrete CMS には Rest API を試すことのできるツール SWAGGER と呼ばれる、ブラウザ上で API エンドポイントをデバッグできるというツールがあります。

Concrete CMS の管理画面から REST API ページに行き、API Integration を作成します。
Integration の詳細ページの下に View API Documentation Console というボタンがあります。

ボタンをクリックすると、ブラウザ上から API エンドポイントをテストできる環境ができるのですが、ご存じですか?

そこでテストをしてみたんですが、500 エラーになってしまいました。(400 エラーではないですね)

なぜ 500 エラーが発生したのか、ちょっと GitHub で PortlandLadb とも確認します。

ご返信ありがとうございます。

>ボタンをクリックすると、ブラウザ上から API エンドポイントをテストできる環境ができるのです
>が、ご存じですか?

知りませんでした。今すぐに試せないので、月曜に試してみます。
500エラーは、
upfile = {‘folder’: folder,‘file’: (‘API_TEST1.pdf’, pdf_file, ‘application/pdf’)}
upload_result = requests.post(get_url,headers=head,files=upfile)
の様に記述した時に、私の方でも発生したと思います。
すみませんが、引き続きよろしくお願いします。

@TatsumaK

僕の方でも試してみたんですが、ちょっとエラーが出るかもです。
そちらでも試していただけると助かります。

私の方でも、Concrete CMSのAPIテスト環境で試してみましたが、Authorizeが上手くいかないですね。
client_idとclient_secretを正しく入力しても、エラーが発生します。

GETのAPIを実行しても404エラーが発生します。
(私の環境では、/var/www/concrete5 をconcrete cmsのホームディレクトリにしているので、そこが関係しているかもしれません)

Pythonからは、GETでファイルのメタを取得したり、Deleteでファイルを削除するのはうまくいきます。PUTでファイルのアップロードが失敗します。(恐らく、pythonコードの記述に問題があると思われます)。もう少し調べてみます。

@TatsumaK どのようなエラーになるか教えてもらうことは可能でしょうか?

@katz515
下図のエラーが発生しますが、どうやらこれは、concete cmsのホームディレクトリを/var/www/concrete5に設定していることに起因しているようです。.comの後ろに/concrete5を入れると、正常なレスポンスが得られました。
ただ、concrete cmsのAPIテストページは
.com/concrete5になっています。これがAuthorizeのテストページでは正しく反映されないようです。
図1.エラーの状況
キャプチャ1
図2.
***.com/concrete5を入力すると正常なレスポンスが得られる


図3.APIテストページは ****.com/concrete5となっている

1 Like

@TatsumaK あー、ありがとうございます。

Concrete CMS は、時々、サブディレクトリにインストールされていることを考慮していない時がありまして・・・今回もそれが原因ですね・・・。

GitHub にバグ報告します。ありがとうございます。

僕はこの次でファイルアップロードでエラーがでたので、TasumaK さんも同じエラーがでるか、確認していただけると助かります。

サブディレクトリにインストールされた時に404 になってしまう件、
GitHub にバグ報告いたしました。

ありがとうございます。

@katz515 こんにちは
ファイルのアップロードも試してみましたが、同じエラーが発生します。
サブディレクトリが考慮されていません。

curl -X ‘POST’
‘http:/*********.com/ccm/api/1.0/files’
-H ‘accept: application/json’
-H ‘Content-Type: multipart/form-data’
-F ‘folder=1000’
-F ‘file=@test-file-j.pdf;type=application/pdf’

404 Not Found

Not Found

The requested URL was not found on this server.

追加で質問ですが、folder No.はどの様にして設定(取得)すればよいのでしょうか?
手動でフォルダーを作成し、なんらかの方法でそのfolder No.を取得すればよいのでしょうか?
それとも、適当なfolder No.を設定しておくと、そのfolderを自動的に作成してくれるのでしょうか?
よろしくお願いいたします。

1 Like

@katz515 こんにちは。
こちらの件、半年ほど放置していましたが、再開させてください。

APIを用いたファイルのアップロードを試みております。
pythonにて

    data = open(file_path, 'rb')
    files = {'file': data}
        
    head = {'Authorization': 'Bearer {}'.format(token)}
    
    res = requests.post(update_url,headers=head, files=files)

上記のようにconcrete cmsへ、ファイルのアップロードを試みておりますが、500エラーが発生します。
バイナリをそのままアップロードすると、500エラーが発生します。
concrete cmsは、バイナリファイルをそのままアップロード出来ない仕様でしょうか?

ちなみに、下記コードでは400エラーとなります

    with open(file_path, 'rb') as file:
        files = {'file': (file.name, file, 'application/pdf')}
    head = {'Authorization': 'Bearer {}'.format(token)}
    res = requests.post(self.update_url,headers=head, data=files)

もし何かわかれば、よろしくお願いいたします。

@katz515
すみませんが、追加で教えてください。

Adds a file objectのエンドポイントの説明に、
folder:integer
とありますが、Concrete cms上で作成したフォルダーのNo.を確認する方法が分かりません。
また、folderを作成したり、folderのNo.を取得するエンドポイントが見つかりません。

folderのNo.を取得する方法を教えて頂けないでしょうか。
若しくはこの、folder:integerは他の意味があるのでしょうか?

すみませんが、よろしくお願いいたします。

1 Like

@TatsumaK ありがとうございます。
ちょっと、僕も心当たりがないので、英語で、トピック立てて聞いてみました

こっちの返信を待ちましょう。

@katz515
ありがとうございます。
返信がないか、チェックします。

@katz515
ありがとうございます。folder IDの取得方法(folder URLの末尾の番号)は理解しました。

しかし、files:add のエンドポイントを API Documentation Consoleから試してみたのですが、やはり、500番エラーが発生します。

そちらでも、試していただけないでしょうか。

よろしくお願いいたします。