【问题标题】:Curl upload with spaces in filenames文件名中带有空格的卷曲上传
【发布时间】: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"&gt;"file with spaces";nc -l -p 4242 -c 'echo -e "HTTP/1.1 200 OK\n\nresponse"' &amp; curl -v http://localhost:4242/ --data-binary @"file with spaces" 测试过;您可能想首先检查curl -v 有什么问题(我不希望会显示太多),然后使用bash -x 检查实际的curl 命令

标签: bash shell curl filenames spaces


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    例子:

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

    【讨论】:

      【解决方案3】:

      TL;DR:问题仍然出现在文件名包含illegal characters, like | > < :的窗口上

      正如@Jerin 指出的那样,windows 上的 curl(至少在版本 > 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 数据传递。

      【讨论】:

        猜你喜欢
        • 2012-06-21
        • 2013-03-21
        • 2011-02-17
        • 2011-06-07
        • 2020-04-24
        • 1970-01-01
        • 2017-07-14
        • 2016-11-11
        • 1970-01-01
        相关资源
        最近更新 更多