2013-07-02 1 views
1

Я пытаюсь подражать этот код Javaвыкладываете файл на PHP сервер с помощью питона и просит

  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) 

ответ от сервера, что я получаю это { «ответ»: «ошибка», «комментарий»: «не хватает, по крайней мере, один параметр»}» любая помощь, пожалуйста?

+0

Что произойдет, если вы ' 'CreateNew =':«true''? –

+1

Также, вы подтвердили, что работает Java-код? –

+0

yup код java работает, я использую его уже несколько недель, и я пробовал, правда, все еще не работал. – ark

ответ

0

Когда вы передаете словарь на 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) 

См аналогичного примера в документации here.

+0

, который не работал, но я изменил полезную нагрузку на 'payload = {'filedata': 'foo', 'systemid': 'fooe', 'createNew': 'false', 'filename': 'bar'}' , а затем я использовал это, но он все еще не работал 'r = request.post (url, files = files, headers = headers, params = payload)' – ark

0

Вам нужно попробовать изменить следующие вещи.

Во-первых, data отправляет данный словарь в тело POST. Если это действительно, где вы хотите, вы должны удалить элементы «=» из словаря:

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

Во-вторых, вы добавляете пару неверных заголовков. Когда вы используете параметр «Запросы» file, запросы обрабатывают данные тела (включая ваш файл) как multipart/form-data'. Затем вы переопределяете этот Content-Type своим application/octet-stream, который является не формой тела. Кроме того, вы утверждаете, что ваши данные тела сжаты с использованием 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) 
+0

пытался, что все еще не работал. Получена та же ошибка, что и раньше. Я решил, что мне нужны эти заголовки b/c, они были включены в файл java – ark

 Смежные вопросы

  • Нет связанных вопросов^_^