【发布时间】:2018-01-17 09:03:49
【问题描述】:
我正在尝试使用 cURL 将文件名中带有空格的文件上传到专用服务器。我正在使用 bash。在以前的项目中,我只是放弃了,从文件名中删除了所有空格。这对这个项目是不可行的。
在详细模式下运行 cURL 表明它在读取我的本地文件路径时停止:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
其中 $LOCAL_FILE 是本地计算机上文件的路径(带有空格),而 $REMOTE_FILE 也有空格。
这给出了:
警告:无法从文件“/Users/my_account/somepath/with”中读取数据
警告:空格
这意味着该命令将"/Users/my_account/somepath/with" 和"spaces" 作为两个单独的路径。
我该如何解决这个问题?
我的完整代码:
#!/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
}
【问题讨论】:
-
我无法用我的 curl 7.29.0 重现,它使用
echo "some content">"file with spaces";nc -l -p 4242 -c 'echo -e "HTTP/1.1 200 OK\n\nresponse"' & curl -v http://localhost:4242/ --data-binary @"file with spaces"测试过;您可能想首先检查curl -v有什么问题(我不希望会显示太多),然后使用bash -x检查实际的curl命令
标签: bash shell curl filenames spaces