How to post a list of files using Curl - python

I need to curl multiple files to a website as a list, but I'm having trouble doing so.
I've tried:
curl -F name=fn1 -F filedata=#fn1.jpg -F name=fn2 -F filedata=#fn2.jpg
But that didn't work, so I tried:
curl -F "files[]=#fn1.jpg&files[]=fn2.jpg"
But that also didn't work.
I'm trying to get the files on the server side using the python request lib, so something like:
files = request.files.getlist('files[]')
But this call always fails, how do I post a list of files using curl?

I figured it out, the syntax is this :
curl -F files=#$WALLPAPERS/0FYIE5G.jpg \
-F files=#$WALLPAPERS/3GVmZmQ.png http://example.com/upload
And on the receiving end :
files = request.files.getlist('files')
Pretty simple actually.

Related

Remove Docker images from privat repo with python

I need to run delete command on python for remove images from docker privat regestry. First of all i need to get correct digest sha56. I got from topic command for find digest.
I am using request library end. In terminal i use command
curl -u Username:Password -sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' -o /dev/null -w '%header{Docker-Content-Digest}' https://regestry/v2/[repo]/manifests/[tag].
i try to use
headers={'Accept':'application/vnd.docker.distribution.manifest.v2+json' }
r=requests.get('https://registry/v2/[repo]/manifests/[tag]', auth=('USername', 'Password'))
print(r.headers['Docker-Content-Digest'])
But i got different digests and i can not delete final image.
Can you help me how i can use first command in python for execution.

How to send '-X POST' using 'requests' library in Python?

I am trying to replicate shell command:
curl -u [staff_email]:[api_key] -F "case[attachments][0]=#/path/to/file1.ext" -F "case[attachments][1]=#/path/to/file2.ext" -F "case[content]=I need help" -F "case[subject]=I need help" -F "case[user_email]=user#domain.ru" -F "case[user_full_name]=FullName" -F "case[language_id]=2" -F "case[custom_fields][cf_44]=3" -X POST https://[domain].omnidesk.ru/api/cases.json
into Python code using Requests library:
import requests
What is a proper syntax for this example (curl -X POST)?
You can use requests.post, as explained here
for the attachments part (your first -F), read here
for the auth part (-u): here

Download in batch with wget and modify files with a python script immediately after download

I want to download climate data from the CHELSA database.
One way to do so programmatically is to use wget, following their guidelines:
Download the file (envidatS3paths.txt), install wget and then run the command: wget --no-host-directories --force-directories --input-file=envidatS3paths.txt .
However, for each file that are downloaded, I would like to perform a operation on them (basically, trimming the data because they are quite big).
I looked at the wget manual, but I could not find anything related to an intermediary script to run inbetween downloads.
I could possibly run a second background command to finds any new downloaded file and trim it, but I wonder if the first solution could be more straightforward.
you can run a for loop over the input file and for each file run wget -O $new_file_name $url
try something like this -
bash
for url in $(cat envidatS3paths.txt); do wget -O $(echo $url | sed "s/\//_/g").out $url ; done
python
for url in opened_file:
subprocess.Popen(f'wget -O {url.rsplit('\')[1]} {url}')

What is the curl command to upload a list of files from an input form in flask?

I need the curl command to upload a list of files from a form file input field. What I have tried:
curl -b cookies.txt -X POST http://localhost:8081/rt/api/v1.0/add -d '{"title":"Website updated", "description": "Not accessible", "requestor":"abc#ytz.com", "mfiles":["file1.txt","file2.txt"]}' -H 'Content-type:Application/json'
The api to upload the files:
for f in request.files.getlist('mfiles'):
filename = secure_filename(f.filename)
f.save(os.path.join(upload_folder, filename))
This gives me error: Statement is not an insert() expression construct.
What is the exact curl to do so? I am using Flask 0.12, python 2.7
#Boris, Yes. I should have used an input form. And the curl used to upload multiple files is:
curl -b cookies.txt -X POST http://localhost:8081/rt/api/v1.0/add -F "title=some title MM" -F "description=Not accessible" -F "mfiles=#crons.txt" -F "mfiles=#temp.txt" -F "mfiles=#duplicates.txt"

How to upload a file to Atlassian Confluence page using curl

I am trying to upload an .xls file to a Confluence wiki page following the guidelines given in the Remote API documentation :
https://developer.atlassian.com/confdev/confluence-server-rest-api/confluence-rest-api-examples#ConfluenceRESTAPIExamples-Uploadanattachment
curl -v -S -u admin:admin -X POST -H "X-Atlassian-Token: nocheck" -F "file=#myfile.txt" -F "comment=this is my file" "http://localhost:8080/confluence/rest/api/content/3604482/child/attachment" | python -mjson.tool
This is what I am doing:
curl -v -S -u username:password -X POST -H "X-Atlassian-Token: nocheck" -F "file=#/path/to/local/excelsheet.xls" https://<Confluence server>/display/page
I omitted the Python -mjson.tool as it says 'No JSON object could be decoded' and it didn't make sense as I am not posting JSON.
However the above curl command is not working for me. I see the html of the target page on my console and the file doesn't get uploaded. I tried modifying the curl command in several ways but nothing worked.
Also for the URL of the page I am trying to upload to, it doesn't have any contentID as suggested in the documentation. The target URL is a page which accepts attachments and shows the uploaded file list.
Could someone please point out where am I going wrong? I don't have much experience with Curl.
David Vonka answer is correct except for header "X-Atlassian-Token" value. It must be "no-check" (instead of "nocheck")
So corrected command is:
curl -v -S -X POST -H "X-Atlassian-Token: no-check" -F "file_0=#<file name>" -F "comment_0=<upload comment>" "http://<server>:<port>/<context>/pages/doattachfile.action?pageId=<page id>&os_username=<username>&os_password=<password>"
NOTE: replace all the <...> placeholders with your values
you need to use REST API in url: .../confluence/rest/api/content/$PAGE_ID/child/attachment and now you are using url of view page.
I do not think that confluence rest api allows file upload. Please do this instead
curl -v -S -X POST -H "X-Atlassian-Token: nocheck" -F "file_0=#<file name>" -F "comment_0=<upload comment>" "http://<server>:<port>/<context>/pages/doattachfile.action?pageId=<page id>&os_username=<username>&os_password=<password>"
replace all the <...> placeholders with your values
The API POST syntax should be corrected from "https://ConfluenceServer/display/page" to the correct res/api/content syntax eg: "https://companyName.atlassian.net/display/rest/api/content/pageIDxxxxx":
curl -v -S -X POST -H "X-Atlassian-Token: no-check" -F "file_0=#<file name>" -F "comment_0=<upload comment>" https://<companyName>.atlassian.net/display/rest/api/content/<pageID15398762>/child/attachment
The pageID can be found in the URL display page. For example:
https://companyName.atlassian.net/display/spaces/DEV/pages/pageID15398762/Page+Title+Name
For more API syntax details please refer to this documentation:
https://docs.atlassian.com/atlassian-confluence/REST/6.6.0/#content-createContent

Categories