ファイル名のスペースを含むファイルを専用のサーバーにアップロードする際にcURLを使用しようとしています。私はbashを使用しています。以前のプロジェクトでは、ファイル名からすべてのスペースを削除するだけでした。このプロジェクトではこれは実現可能ではありません。冗長モードでカールを実行ファイル名に空白を含むカールアップロード
は、それは私のローカルファイルパスを読み込むときに止まることを示唆している:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
、および$ REMOTE_FILEにもスペースがあります。
これが与える:
警告:コマンドを意味し、スペース
を取っている:
警告して「ファイルからデータを読み取ることができませんでした/ユーザ/ my_account/somepathを/ "/Users/my_account/somepath/with"
と"spaces"
を別々の2つのパスとして指定します。
この問題を解決するにはどうすればよいですか?
私の完全なコード:
#!/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
}
私は 'エコー "いくつかのコンテンツ"> "スペースを含むファイル" を使用してテスト私のカール7.29.0、で再現することはできません。NC -l -p 4242 -c「エコー-e "HTTP/1.1 200 OK \ n \ nresponse" '&curl -v http:// localhost:4242/--data-binary @ "スペースを含むファイル"; 'curl -v'で何が間違っているかを最初に確認したいと思うかもしれませんが(私はそれほど多くはないと思われます)、実際の' curl'コマンドを検査する 'bash -x' – Aaron