Question

J'ai du mal à soumettre un formulaire particulier avec requêtes python.Les autres formulaires sur le site que je souhaite utiliser fonctionnent correctement et je peux soumettre le formulaire de connexion, etc.C'est juste le téléchargement de fichiers qui me pose problème.Apparemment, la soumission du formulaire fonctionne bien car je reçois un message du site disant "Veuillez revenir en arrière et sélectionner au moins un fichier image à télécharger." Mais le fichier n'est pas publié sur le site.

Si je regarde la requête avec le plugin Firefox Tamperdata, elle ressemble à ceci après avoir soumis le formulaire vide :

-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="upload_to"\r
\r
0\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="upload_type"\r
\r
standard\r
-----------------------------201075691119887339851216603987--\r

(J'ai remplacé tous les par des sauts de ligne pour le rendre un peu plus lisible)

Mon code de téléchargement Python ressemble à ceci :

index = s.get("https://example.com/")
file = {'userfile[]': open('tmp/cover/cover.jpg', 'rb')}

res = s.post(url='https://example.com/upload.php',
                data=file,
                headers={'Content-Type': 'application/octet-stream'})

Le formulaire HTML ressemble à ceci :

<form action="upload.php" method="post" id="upload_form" enctype="multipart/form-data">
    <p>
        <input name="userfile[]" type="file" size="30"> <br>
        <input name="userfile[]" type="file" size="30"> <br>
        <input name="userfile[]" type="file" size="30"> <br>
        <input name="userfile[]" type="file" size="30"> <br>
        <input name="userfile[]" type="file" size="30"> <br>

        <span id="more_file_inputs"></span>
        <br>
        <span id="upoptions_hidden">
            Uploading Options: <a href="javascript:void(0);" onclick="toggle('upoptions_hidden'); toggle('upoptions_shown');">Show</a>
        </span>

        <span id="upoptions_shown" style="display: none;">
            Uploading Options: <a href="javascript:void(0);" onclick="toggle('upoptions_hidden'); toggle('upoptions_shown');">Hide</a>
            <br><br>

                                Upload to: 
                <select name="upload_to">

                    <option value="0">Root Album</option>

                </select>
                <br><br>


           Output Layout: <input type="radio" name="upload_type" value="standard" checked="checked"> <span onclick="toggle_lightbox('index.php?layoutprev=std', 'upload_layout_preview_lightbox');" title="Click to preview" class="help">Standard</span> <input type="radio" name="upload_type" value="normal-boxed"> <span onclick="toggle_lightbox('index.php?layoutprev=bx', 'upload_layout_preview_lightbox');" title="Click to preview" class="help">Boxed</span>
        </span>
        <br><br>

        <input class="button1" type="button" value="Add File" onclick="new_file_input();"> 
        <input class="button1" style="font-weight:bold;" type="button" value="Start Upload" onclick="toggle_lightbox('index.php?act=upload_in_progress', 'progress_bar_lightbox'); $('form[id=upload_form]').submit();">
    </p>
</form>

Avez-vous une idée de ce qui ne va pas ici ou d'une meilleure façon de déboguer cela ?Merci!

Modifier:Je viens de réaliser que je n'ai pas vraiment soumis le upload_type et upload_to champs mais même si je les définis comme :

file = {'userfile[]': open('tmp/cover/cover.jpg', 'rb'), 'upload_to': '0', 'upload_type': 'standard'}

ça ne marche toujours pas.

Était-ce utile?

La solution

Utilisez le files mot-clé pour effectuer votre téléchargement, pas data.Ne définissez pas non plus l'en-tête content-type ;le formulaire est publié sous forme de données de formulaire en plusieurs parties et les demandes doivent utiliser le type de contenu approprié pour vous :

res = s.post(
    url='https://example.com/upload.php',
    data={'upload_type': 'standard', 'upload_to': '0'},
    files=file)

et placez le reste des champs du formulaire dans un mappage dans data.

Si vous souhaitez télécharger plusieurs fichiers sous le même nom, utilisez un séquence de fichiers :

files = {
    'userfile[]': [
        open('tmp/cover/cover1.jpg', 'rb'),
        open('tmp/cover/cover2.jpg', 'rb'),
    ]
}

res = s.post(
    url='https://example.com/upload.php',
    data={'upload_type': 'standard', 'upload_to': '0'},
    files=files)

Autres conseils

Je vois deux problèmes avec votre code :

  • Vous définissez le type de contenu manuellement. Ne le faites pas.La bibliothèque s'en chargera.C'est particulièrement.car lors de la publication des données du formulaire en plusieurs parties, les en-têtes ressemblent à : Content-Type: multipart/form-data; boundary=<blah>.
  • D'après la documentation, vous devriez utiliser un files argument nommé pour télécharger un fichier, pas data.

Utiliser:

res = s.post(url='https://example.com/upload.php',
            data=<dict containing form params>,
            files=file)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top