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.エラーの状況
図2. ***.com/concrete5を入力すると正常なレスポンスが得られる
図3.APIテストページは ****.com/concrete5となっている
1 Like
@TatsumaK あー、ありがとうございます。
Concrete CMS は、時々、サブディレクトリにインストールされていることを考慮していない時がありまして・・・今回もそれが原因ですね・・・。
GitHub にバグ報告します。ありがとうございます。
僕はこの次でファイルアップロードでエラーがでたので、TasumaK さんも同じエラーがでるか、確認していただけると助かります。
サブディレクトリにインストールされた時に404 になってしまう件、
GitHub にバグ報告いたしました。
opened 06:51AM - 04 Aug 23 UTC
Type:Bug
### Affected Version of Concrete CMS
9.x
### Description
I'm just passi… ng the bug report from a Japanese user, [TatsumaK](https://forums.concretecms.org/u/TatsumaK)
https://forums.concretecms.org/t/9-2-0-rest-api/5888/7
REST APi auth page of the Concrete doesn't output DIR_REL (the directory path if Concrete is installed in the subdirectory)
### How to reproduce
- Install Concrete in the directory like `/concrete`
- Create a new Rest API endpoint and create authorization
- The URL endpoint doesn't output `/concrete` path, which should be included, resulted with 404 error
### Possible Solution
Add DIR_REL
### Additional Context
_No response_
ありがとうございます。
@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
katz515
January 23, 2024, 7:39am
13
@TatsumaK ありがとうございます。
ちょっと、僕も心当たりがないので、英語で、トピック立てて聞いてみました
This is the translation of the following post
https://forums.concretecms.org/t/9-2-0-rest-api/5888/12
@TatsumaK is trying to make a use of RestAPI.
He wants to know the following
What does “integer” of “folder:integer” mean at Adds a file object documentation
He wants to know how he can check the folder ID
He wants to know is there any RestAPI endpoint to create folder
Thanks
こっちの返信を待ちましょう。
@katz515
ありがとうございます。
返信がないか、チェックします。
@katz515
ありがとうございます。folder IDの取得方法(folder URLの末尾の番号)は理解しました。
しかし、files:add のエンドポイントを API Documentation Consoleから試してみたのですが、やはり、500番エラーが発生します。
そちらでも、試していただけないでしょうか。
よろしくお願いいたします。