使用文件名中的空格卷曲上传

时间:2017-08-09 12:53:18

标签: bash shell curl filenames spaces

我正在尝试使用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
}

3 个答案:

答案 0 :(得分:0)

您是否尝试更改脚本中IFS的值?通常,其值设置为$' \t\n',其中包括空格。将其设置为不是这样的:IFS=并且根本不执行字段拆分。您可以通过执行unset IFS来获取默认值。

示例:

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

答案 1 :(得分:0)

在Curl Windows 7.55.0版本中(也应该在更高版本中),以下命令将起作用,

本地Windows路径:路径用双引号或单引号引起来

服务器url路径:路径用双引号或单引号引起来,并且每个空格都用'%20'替换,下面给出了上传“ tes st.txt”的示例

curl -username:password -T“ ./Test/te st.txt”“ http://server-url/folder1/folder2/te%20st.txt

答案 2 :(得分:0)

TL; DR :在文件名包含illegal characters, like | > < :

的Windows上仍然会出现问题

@Jerin指出,在Windows上进行卷曲(至少在版本> 7.55.0中)将接受文件名中的空格。

但是,在curl 7.57.0(x86_64-w64-mingw32)中,我正在观察

curl -X POST http://localhost:8080/ -H "Content-Type: application/json" --data-binary "@my_dir/2019-11-04>.json"

给我

Warning: Couldn't read data from file "my_dir/2019-11-04>.json",
Warning: this makes an empty POST.

并且不会将文件作为POST数据传递。