mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-02-06 19:06:02 +03:00
Help to understand a complete workflow for creating pages with images using API #4380
Closed
opened 2026-02-05 08:44:00 +03:00 by OVERLORD
·
5 comments
No Branch/Tag Specified
development
further_theme_development
l10n_development
release
llm_only
vectors
v25-11
docker_env
drawio_rendering
user_permissions
ldap_host_failover
svg_image
prosemirror
captcha_example
fix/video-export
v25.12.3
v25.12.2
v25.12.1
v25.12
v25.11.6
v25.11.5
v25.11.4
v24.11.4
v25.11.3
v25.11.2
v25.11.1
v25.11
v25.07.3
v25.07.2
v25.07.1
v25.07
v25.05.2
v25.05.1
v25.05
v25.02.5
v25.02.4
v25.02.3
v25.02.2
v25.02.1
v25.02
v24.12.1
v24.12
v24.10.3
v24.10.2
v24.10.1
v24.10
v24.05.4
v24.05.3
v24.05.2
v24.05.1
v24.05
v24.02.3
v24.02.2
v24.02.1
v24.02
v23.12.3
v23.12.2
v23.12.1
v23.12
v23.10.4
v23.10.3
v23.10.2
v23.10.1
v23.10
v23.08.3
v23.08.2
v23.08.1
v23.08
v23.06.2
v23.06.1
v23.06
v23.05.2
v23.05.1
v23.05
v23.02.3
v23.02.2
v23.02.1
v23.02
v23.01.1
v23.01
v22.11.1
v22.11
v22.10.2
v22.10.1
v22.10
v22.09.1
v22.09
v22.07.3
v22.07.2
v22.07.1
v22.07
v22.06.2
v22.06.1
v22.06
v22.04.2
v22.04.1
v22.04
v22.03.1
v22.03
v22.02.3
v22.02.2
v22.02.1
v22.02
v21.12.5
v21.12.4
v21.12.3
v21.12.2
v21.12.1
v21.12
v21.11.3
v21.11.2
v21.11.1
v21.11
v21.10.3
v21.10.2
v21.10.1
v21.10
v21.08.6
v21.08.5
v21.08.4
v21.08.3
v21.08.2
v21.08.1
v21.08
v21.05.4
v21.05.3
v21.05.2
v21.05.1
v21.05
v21.04.6
v21.04.5
v21.04.4
v21.04.3
v21.04.2
v21.04.1
v21.04
v0.31.8
v0.31.7
v0.31.6
v0.31.5
v0.31.4
v0.31.3
v0.31.2
v0.31.1
v0.31.0
v0.30.7
v0.30.6
v0.30.5
v0.30.4
v0.30.3
v0.30.2
v0.30.1
v0.30.0
v0.29.3
v0.29.2
v0.29.1
v0.29.0
v0.28.3
v0.28.2
v0.28.1
v0.28.0
v0.27.5
v0.27.4
v0.27.3
v0.27.2
v0.27.1
v0.27
v0.26.4
v0.26.3
v0.26.2
v0.26.1
v0.26.0
v0.25.5
v0.25.4
v0.25.3
v0.25.2
v0.25.1
v0.25.0
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.2
v0.23.1
v0.23.0
v0.22.0
v0.21.0
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.0
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.15.3
v0.15.2
v0.15.1
v0.15.0
v0.14.3
v0.14.2
v0.14.1
v0.14.0
v0.13.1
v0.13.0
v0.12.2
v0.12.1
v0.12.0
v0.11.2
v0.11.1
v0.11.0
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.6
v0.7.5
v0.7.4
v0.7.3
0.7.2
v.0.7.1
v0.7.0
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.0
Labels
Clear labels
🎨 Design
📖 Docs Update
🐛 Bug
🐛 Bug
:cat2:🐈 Possible duplicate
💿 Database
☕ Open to discussion
💻 Front-End
🐕 Support
🚪 Authentication
🌍 Translations
🔌 API Task
🏭 Back-End
⛲ Upstream
🔨 Feature Request
🛠️ Enhancement
🛠️ Enhancement
🛠️ Enhancement
❤️ Happy feedback
🔒 Security
🔍 Pending Validation
💆 UX
📝 WYSIWYG Editor
🌔 Out of scope
🔩 API Request
:octocat: Admin/Meta
🖌️ View Customization
❓ Question
🚀 Priority
🛡️ Blocked
🚚 Export System
♿ A11y
🔧 Maintenance
> Markdown Editor
pull-request
Mirrored from GitHub Pull Request
No Label
🐕 Support
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/BookStack#4380
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @yulia-roensch on GitHub (Dec 28, 2023).
Attempted Debugging
Searched GitHub Issues
Describe the Scenario
Hi,
I am trying to create a page using the API. The page must have images.
Steps:
requestslibrary, I created a page using HTML as a body.<span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" draggable="false" src="attachments/104497408/104497409.jpg" data-image-src="attachments/104497408/104497409.jpg" data-unresolved-comment-count="0" data-linked-resource-id="104497409" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="(Docu User) Asset page concept 2018.3.jpg" data-base-url="https://confluence.company.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="104497408" data-linked-resource-container-version="1" alt=""></span>My question is: should I upload the image before creating the page?
I tried to upload image as image and as attachment following your API documentation. But I am not sure what is wrong with my call:
Throws an error:
Tried to upload the image as an attachment:
Throws an error:
Please help me to understand what is wrong with my requests or maybe with the order in general (first upload images then create a page, but you need a page id to upload an image, right?)
Thank you!
Exact BookStack Version
v23.08.3
Log Content
No response
Hosting Environment
Bookstack is currently running on a VM that uses the following hardware:
Software:
It has been installed using the official installation script.
@toras9000 commented on GitHub (Jan 27, 2024):
It looks like you are sending the "file location" in your API request.
Even if you send the location in your computer, the server cannot see the contents of your computer.
You need to have a good grasp of what data you need to send with the API. This also requires knowledge of HTTP.
A sample code that probably matches what you are looking for can be found here.
https://github.com/BookStackApp/api-scripts
If you find it difficult, you can use a wrapper library.
@whimsee commented on GitHub (Jan 18, 2025):
I gave this a shot because I was already using the API via Python Requests to create entries. Except for images, which took a lot of tinkering to work out due to how Requests abstracts the process and how the php backend interprets the request.
Setup:
Originally, I tried the following:
response = requests.post(url, json=todo, files=files, headers=headers)Note "json" was used instead of "data" because it worked so far, but apparently there's some fuzziness with the Requests library per #5087 that I actually didn't know at the time; I just prefer using json payloads.
This doesn't work as far as I've tried. You always end up with validation errors with "name" being required (which isn't an issue if files is removed) and if you do it like so:
You end up with "name" and "description_html" expecting a string, which you can't really do much with because of how the Requests library processes multipart requests.
So I eventually tried this:
And it worked! Note that "data" is now used instead of "json". Not sure if this will cause some hiccups down the road but it got the image to upload provided the required fields are filled in.
As for files, it's the standard workflow for uploading files via multipart forms. It can take open() as is (the filename is supplied automatically), but you can tuple it with a different filename and an optional MIME type if needed.
@ssddanbrown commented on GitHub (Jan 18, 2025):
@whimsee You can send everything via the
filesparameter as shown here:28f1407c82/python-upload-attachment/main.py (L68-L75)Just have to use the tuple format expected by requests.
@whimsee commented on GitHub (Jan 18, 2025):
Ah. Nice. Good to know there's another, more elegant solution. Thanks! I'll repurpose that for my code and hopefully this helps whoever else is having this issue since I couldn't find that when I looking for a solution.
@ssddanbrown commented on GitHub (Jan 18, 2025):
I'm going to close this off since there was no further follow up from OP.
Thanks @toras9000 for helping originally, and thanks @whimsee for sharing your own solution/findings to help others!