Ich versuche cURL zu verwenden, um Dateien mit Leerzeichen in ihren Dateinamen auf einen dedizierten Server hochzuladen. Ich benutze Bash. In einem früheren Projekt habe ich einfach aufgegeben und alle Leerzeichen aus den Dateinamen entfernt. Dies ist für dieses Projekt nicht möglich.Curl Upload mit Leerzeichen in Dateinamen
Lauf cURL im ausführlichen Modus läßt vermuten, dass es stoppt, wenn es meinen lokalen Dateipfad lautet:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
wo $ local_file einen Pfad zu einer Datei auf meinem lokalen Rechner ist (mit Leerzeichen) und $ REMOTE_FILE hat auch Leerzeichen.
Dies gibt:
Achtung: keine Daten aus Datei lesen konnte „/ Users/my_account/somepath/mit
Warnung: Räume
, die den Befehl impliziert nimmt "/Users/my_account/somepath/with"
und "spaces"
als zwei separate Pfade
Wie kann ich das lösen?
Mein vollständiger Code:
#!/bin/bash -ex
# Local dir - note space in path
IMAGES_DIR="/Users/my_account/somepath/with spaces"
# Remote server, and credentials
SERVER="http://myserver"
REMOTE_DIR="mydir"
USER="myname"
PASS="mypass"
FILE="$1"
LOCAL_FILE="$IMAGES_DIR/$FILE"
REMOTE_FILE=urlencode $FILE
# Move file to the server
curl -v -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
# Check that file has made it
echo 'Waiting for file to be on server'
until [ $result > 0 ]
do
result=$(curl -I "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE" -u $USER:$PASS 2>/dev/null | grep Content-Length | awk -F ': ' '{print $2}')
echo "."
sleep 2
done
echo "File $FILE is now on server."
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for ((i = 0; i < length; i++)); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
Ich kann nicht mit meinem curl 7.29.0, die mit 'echo "einige Inhalte"> "Datei mit Leerzeichen" getestet reproduzieren; nc -l -p 4242 -c‚echo -e "HTTP/1.1 200 OK \ n \ nResponse" '& curl -v http: // localhost: 4242/--data-binary @ "Datei mit Leerzeichen" '; Vielleicht möchten Sie zuerst überprüfen, was mit 'curl -v' nicht stimmt (was ich nicht erwarten werde, wird viel verraten), dann mit' bash -x', um den tatsächlichen 'curl'-Befehl zu prüfen – Aaron