簡體   English   中英

試圖使用python和請求將文件發布到php服務器

[英]trying to post file to php server using python and requests

我正在嘗試模擬此Java代碼

            public static void uploadFile(String filename, String systemID){
            try{
                    String createNew = "false";

                    //check for backup files to know if we should make a new file on the server
                    File f = new File(filename + ".1");
                    if(f.exists()){
                            createNew = "true";
                            f.delete();
                    }

                    HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL(uploadURL).openConnection();
            httpUrlConnection.setDoOutput(true);
            httpUrlConnection.setRequestMethod("POST");
            httpUrlConnection.setRequestProperty("Content-encoding", "deflate");
            httpUrlConnection.setRequestProperty("Content-type", "application/octet-stream");
            java.io.OutputStream os = httpUrlConnection.getOutputStream();
            Thread.sleep(1000);

            String fileData = IOUtils.toString(new FileReader(filename));

            String request = "filedata=" + fileData + "&filename=" + filename + "&systemid=" + systemID + "&createNew=" + createNew;

            DeflaterOutputStream deflate = new DeflaterOutputStream(os);
            deflate.write(request.getBytes());
            deflate.flush();
            deflate.close();

            os.close();
            BufferedReader in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));

            String s = null;
            while ((s = in.readLine()) != null) {
                System.out.println(s);
            }
            in.close();
            //fis.close();
            }catch(Exception e){
                    e.printStackTrace();
            }
            static String uploadURL = "http://vp-creations.com/utilities/fileupload.php";

在使用請求的python中,我認為我缺少一些簡單的東西,因為我無法從服務器獲得正確的響應

import requests
url = 'http://vp-creations.com/utilities/fileupload.php'
files = {'file': open('C:\\etc\\guitartab.txt', 'rb')}
headers = {'Content-encoding': 'deflate', 'Content-type': 'application/octet-stream'}

payload = {'filedata=': 'foo', 'filename=': 'bar', 'systemid=' : 'fooe', 'createNew=' : 'false'}

r = requests.post(url, files=files, headers=headers, data=payload)

我不斷收到的來自服務器的響應是{“ response”:“錯誤”,“ comment”:“缺少至少一個參數”}'有什么幫助嗎?

當你傳遞一個字典的data參數requests.post ,這將是形式編碼。 我對Java代碼並不完全熟悉,但是看起來它實際上是在使用編碼的String作為請求的數據。 為了實現與requests相同的功能,請將字符串作為data參數傳遞,如下所示:

data = 'filedata=foo&filename=bar&systemid=&fooe&createNew=false'
r = requests.post(url, files=files, headers=headers, data=data)

請參閱此處的文檔中的類似示例。

您需要嘗試更改以下內容。

首先, data在POST正文中發送給定的字典。 如果這確實是您想要的位置,則需要從字典中刪除'='元素:

payload = {'filedata': 'foo', 'filename': 'bar', 'systemid' : 'fooe', 'createNew' : 'false'}

其次,您要添加一對錯誤的標題。 使用Requests的file參數時,Requests將主體數據(包括文件)准備為multipart/form-data' 然后,您可以使用application/octet-stream覆蓋該Content-Type,它不是主體的形式。 此外,您聲稱您的身體數據是使用deflate ,而事實並非如此。

嘗試以下代碼:

import requests
url = 'http://vp-creations.com/utilities/fileupload.php'
files = {'file': open('C:\\etc\\guitartab.txt', 'rb')}

payload = {'filedata': 'foo', 'filename': 'bar', 'systemid' : 'fooe', 'createNew' : 'false'}

r = requests.post(url, files=files, data=payload)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM