2017-08-09 7 views
0

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 
} 
+1

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

Répondre

0

Avez-vous essayé de changer la valeur de IFS dans votre script? Normalement, sa valeur est $' \t\n', ce qui inclut l'espace. Réglez-le à rien comme: IFS= et aucune division de champ n'est effectuée du tout. Vous pouvez récupérer la valeur par défaut en exécutant unset IFS.

Exemple:

var="a b c d" 
echo $var 
a b c d 
IFS= 
echo $var 
a b c d