J'essaie d'utiliser cURL pour télécharger des fichiers avec des espaces dans leurs noms de fichiers sur un serveur dédié. J'utilise bash. Dans un projet précédent, j'ai juste abandonné, supprimant tous les espaces des noms de fichiers. Ce n'est pas faisable pour ce projet.Transfert Curl avec des espaces dans les noms de fichiers
Exécution cURL en mode verbose suggère qu'il arrête quand il lit mon chemin de fichier local:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
où $ local_file est un chemin vers un fichier sur ma machine locale (avec des espaces) et $ REMOTE_FILE a également des espaces.
Cela donne:
Avertissement: Impossible de lire les données du fichier «/Users/my_account/somepath/avec
Attention: espaces
ce qui implique la commande est prise "/Users/my_account/somepath/with"
et "spaces"
comme deux chemins distincts
Comment puis-je résoudre ce problème?
Mon code complet:
#!/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
}
Je ne peux pas reproduire avec ma boucle 7.29.0, qui a testé avec "fichier avec des espaces" 'echo "un contenu">; nc -l -p 4242 -c « echo -e "HTTP/1.1 200 OK \ n \ nresponse" '& curl -v http: // localhost: 4242/--data-binaire @ "fichier avec espaces" '; vous pourriez vouloir vérifier ce qui ne va pas avec 'curl -v' au début (ce que je ne pense pas révéler beaucoup), puis avec' bash -x' pour inspecter la commande 'curl' actuelle – Aaron