2014-01-23 2 views
1

Я хочу загрузить файл на php-сервер. я мог загрузить файл с ниже способом:загрузить файл, используя метод post в android

curl -i -X POST -F [email protected] http://something/sth 

и после этого я могу загрузить с помощью браузера.

, но при загрузке файла с использованием кода java я не смог загрузить с помощью браузера.

URL url = new URL(mUrl); 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     String Tag = "fSnd"; 
     Log.e(Tag, "Starting Http File Sending to URL"); 
     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
       bytes); 
     // Open a HTTP connection to the URL 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

     // Allow Inputs 
     conn.setDoInput(true); 

     // Allow Outputs 
     conn.setDoOutput(true); 

     // Don't use a cached copy. 
     conn.setUseCaches(false); 

     // Use a post method. 
     conn.setRequestMethod("POST"); 

     conn.setRequestProperty("Connection", "Keep-Alive"); 

     conn.setRequestProperty("Content-Type", 
       "multipart/form-data;boundary=" + boundary); 

     DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"title\"" 
       + lineEnd); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes("File1"); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + lineEnd); 

     dos.writeBytes("Content-Disposition: form-data; name=\"description\"" 
       + lineEnd); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes("File2"); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + lineEnd); 

     dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" 
       + "File3.jpg" + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 

     Log.e(Tag, "Headers are written"); 

     byte data[] = new byte[1024 * 2]; 
     int count = 0; 
     while ((count = byteArrayInputStream.read(data)) != -1) { 
      mSoFarLength += count; 
      Log.d("FFF", "count : " + count + " mSoFarLength : " 
        + mSoFarLength + " mTotalLength : " + mTotalLength); 
      dos.write(data, 0, count); 
      mProgress = ((mSoFarLength * 100)/mTotalLength); 
      for (LocalTransmitterListener baseTransmitterListener : baseTransmitterListeners) { 
       baseTransmitterListener.onUpdateProgress(mProgress); 
      } 
     } 

     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // close streams 
     byteArrayInputStream.close(); 

     dos.flush(); 

     Log.e(Tag, 
       "File Sent, Response: " 
         + String.valueOf(conn.getResponseCode())); 

     InputStream is = conn.getInputStream(); 

     // retrieve the response from server 
     int ch; 

     StringBuffer b = new StringBuffer(); 
     while ((ch = is.read()) != -1) { 
      b.append((char) ch); 
     } 
     String s = b.toString(); 
     Log.i("Response", s); 
     dos.close(); 

ответ

0

по крайней мере, я нашел solution.i следует обратить внимание на лицо name.and оно должно быть таким же, как сервер.

  DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(mUrl); 
     File file = new File(mFileAdrress); 
     FileInputStream fileInputStream = new FileInputStream(file); 
     httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, 
       System.getProperty("http.agent")); 
     InputStreamBody inputStreamBody = new InputStreamBody(
       fileInputStream, file.getName()); 

     MultipartEntityBuilder multipartEntity = MultipartEntityBuilder 
       .create(); 
     multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
     multipartEntity.addPart("file", inputStreamBody); // file should be same as server 
     final HttpEntity myEntity = multipartEntity.build(); 
     class ProgressiveEntity implements HttpEntity { 
      @Override 
      public void consumeContent() throws IOException { 
       myEntity.consumeContent(); 
      } 

      @Override 
      public InputStream getContent() throws IOException, 
        IllegalStateException { 
       return myEntity.getContent(); 
      } 

      @Override 
      public Header getContentEncoding() { 
       return myEntity.getContentEncoding(); 
      } 

      @Override 
      public long getContentLength() { 
       return myEntity.getContentLength(); 
      } 

      @Override 
      public Header getContentType() { 
       return myEntity.getContentType(); 
      } 

      @Override 
      public boolean isChunked() { 
       return myEntity.isChunked(); 
      } 

      @Override 
      public boolean isRepeatable() { 
       return myEntity.isRepeatable(); 
      } 

      @Override 
      public boolean isStreaming() { 
       return myEntity.isStreaming(); 
      } 

      @Override 
      public void writeTo(OutputStream outstream) throws IOException { 

       class ProxyOutputStream extends FilterOutputStream { 

        public ProxyOutputStream(OutputStream proxy) { 
         super(proxy); 
        } 

        public void write(int idx) throws IOException { 
         out.write(idx); 
        } 

        public void write(byte[] bts) throws IOException { 
         out.write(bts); 
        } 

        public void write(byte[] bts, int st, int end) 
          throws IOException { 
         out.write(bts, st, end); 
        } 

        public void flush() throws IOException { 
         out.flush(); 
        } 

        public void close() throws IOException { 
         out.close(); 
        } 
       } 
       class ProgressiveOutputStream extends ProxyOutputStream { 
        public ProgressiveOutputStream(OutputStream proxy) { 
         super(proxy); 
        } 

        public void write(byte[] bts, int st, int end) 
          throws IOException { 
         writed += end; 
         out.write(bts, st, end); 
         mProgress = (int) ((mSoFarLength * 100)/(mTotalLength)); 
        } 
       } 

       myEntity.writeTo(new ProgressiveOutputStream(outstream)); 
      } 

     } 
     ProgressiveEntity progressiveEntity = new ProgressiveEntity(); 
     httpPost.setEntity(progressiveEntity); 
     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     String state = EntityUtils.toString(httpEntity); 
1

Это мой код для загрузки, и это работа. Вам нужно импортировать httpmime jar
PHP кода

$uploads_dir = '/Library/WebServer/Documents/Upload/upload/'.$_FILES['userfile']['name']; 
if(is_uploaded_file($_FILES['userfile']['tmp_name'])) { 
    echo $_POST["contentString"]."\n"; 
    echo "File path = ".$uploads_dir; 
    move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $uploads_dir); 
} else { 
    echo "\n Upload Error"; 
    echo "filename '". $_FILES['userfile']['tmp_name'] . "'."; 
    print_r($_FILES); 

Java код

HttpClient client = new DefaultHttpClient(); 
HttpPost postMethod = new HttpPost("http://localhost/Upload/index.php"); 

File file = new File(filePath); 

MultipartEntity entity = new MultipartEntity(); 
FileBody contentFile = new FileBody(file); 
entity.addPart("userfile",contentFile); 

StringBody contentString = new StringBody("This is contentString"); 
entity.addPart("contentString",contentString); 

postMethod.setEntity(entity); 
HttpResponse response = client.execute(postMethod); 
HttpEntity httpEntity = response.getEntity(); 
String state = EntityUtils.toString(httpEntity); 
+0

Мне нужно загрузить индикатор прогресса. Спасибо за ваш код, но в java upload part, где я могу загрузить мои данные о ходе выполнения? –

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