2017-08-09 1 views
0

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

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

Antwort

0

Haben Sie versucht, den Wert von IFS in Ihrem Skript zu ändern? Normalerweise wird der Wert auf $' \t\n' gesetzt, der Speicherplatz enthält. Setzen Sie es auf nichts wie folgt: IFS= und überhaupt keine Feldaufteilung durchgeführt wird. Sie können den Standardwert wiederherstellen, indem Sie unset IFS ausführen.

Beispiel:

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