1

django フォーム経由でファイルをアップロードしてから、API に送信しようとしています。

エンコーディング関数は次のとおりです。

#FYI, requestFile = request.FILES['file']
def EncodeFile(self, requestFile, fields = []):

    BOUNDARY    = '----------boundary------'
    CRLF        = '\r\n'
    body        = []
    # Add the metadata about the upload first

    for param in fields:
        body.extend(
          ['--' + BOUNDARY,
           'Content-Disposition: form-data; name="%s"' % param,
           '',
           fields[param],
           ])

    fileContent = requestFile.read()

    body.extend(
      ['--' + BOUNDARY,
       'Content-Disposition: form-data; name="file"; filename="%s"'
       % requestFile.name,
       # The upload server determines the mime-type, no need to set it.
       'Content-Type: ' + requestFile.content_type,
       '',
       fileContent,
       ])

    # Finalize the form body
    body.extend(['--' + BOUNDARY + '--', ''])
    result =  'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
    return result

問題は、「CRLF.join(body)」に到達すると、「'utf8' コーデックは位置 0 のバイト 0xff をデコードできません: 無効な開始バイト」について不平を言うことです。

requestFile が実際にはファイルへのパスであり、コンテンツを読み取る前に open(requestFile, 'rb') を実行していることを除いて、まったく同じコードがコマンド ラインから問題なく動作します。

私は一生、次に何をすべきかを理解できません。私は過去10時間ほど答えを探していました。

4

2 に答える 2

1

どうやらこのコード行が問題を引き起こしているようです:

'Content-Disposition: form-data; name="file"; filename="%s"' % requestFile.name,

正しい行は次のようになります。

'Content-Disposition: form-data; name="file"; filename="%s"' % smart_str(requestFile.name),
于 2012-05-30T08:43:34.437 に答える
0

データを文字列にデコードしようとしていますが、結合関数で失敗します。django が厳密モードを使用してデータをデコードしようとすると、エラーがスローされます。ignoreモードはそれらのバイトをスキップするだけです。これは、コンソールから動作するように見える理由を説明するかもしれません)。

したがって、応答オブジェクトを Unicode 文字列に変換する必要はありません。どの関数がそれを変換しようとしているのかをデバッグして、それを防ぐようにしてください。join() 関数は、Unicode への変換を試みるべきではありません。

問題を見つけるには、このように単純化して、根本原因を見つけるのに役立ちます。これはPythonシェルで機能します(ただし、あなたの場合は同じエラーが発生するはずです):

body = ["1", "\xff"]
result = 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
于 2012-05-27T21:47:31.393 に答える