2014-01-12 3 views
0

Я пытаюсь загрузить файл изображения и аудиофайл с Android на Php-сервер одновременно, это способ загрузки на стороне Android:Android не удалось загрузить несколько типов файлов на сервер PHP

public String postFile(File image,File audio) throws Exception { 

    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(uploadUrl); 
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();   
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 

    FileBody fbImage = new FileBody(image); 
    FileBody fbAudio = new FileBody(audio); 

    builder.addPart("image", fbImage); 
    builder.addPart("audio", fbAudio); 
    final HttpEntity yourEntity = builder.build(); 

    class ProgressiveEntity implements HttpEntity { 
     @Override 
     public void consumeContent() throws IOException { 
      yourEntity.consumeContent();     
     } 
     @Override 
     public InputStream getContent() throws IOException, 
       IllegalStateException { 
      return yourEntity.getContent(); 
     } 
     @Override 
     public Header getContentEncoding() {    
      return yourEntity.getContentEncoding(); 
     } 
     @Override 
     public long getContentLength() { 
      return yourEntity.getContentLength(); 
     } 
     @Override 
     public Header getContentType() { 
      return yourEntity.getContentType(); 
     } 
     @Override 
     public boolean isChunked() {    
      return yourEntity.isChunked(); 
     } 
     @Override 
     public boolean isRepeatable() { 
      return yourEntity.isRepeatable(); 
     } 
     @Override 
     public boolean isStreaming() {    
      return yourEntity.isStreaming(); 
     } // CONSIDER put a _real_ delegator into here! 

     @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(); 
       } 
      } // CONSIDER import this class (and risk more Jar File Hell) 

      class ProgressiveOutputStream extends ProxyOutputStream { 
       public ProgressiveOutputStream(OutputStream proxy) { 
        super(proxy); 
       } 
       public void write(byte[] bts, int st, int end) throws IOException { 

        // FIXME Put your progress bar stuff here! 

        out.write(bts, st, end); 

        if(end==bts.length-1){ 
         dialog.dismiss(); 
         Toast.makeText(TakePhotoActivity.this, "File Upload Complete.", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 

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

    }; 
    ProgressiveEntity myEntity = new ProgressiveEntity(); 

    post.setEntity(myEntity); 
    HttpResponse response = client.execute(post); 

    System.out.println("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU "+getContent(response)); 

    return getContent(response); 

} 

public static String getContent(HttpResponse response) throws IOException { 
    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
    String body = ""; 
    String content = ""; 

    while ((body = rd.readLine()) != null) 
    { 
     content += body + "\n"; 
    } 
    return content.trim(); 
} 

И это Php часть:

<?php 

$file_path = "uploads/"; 

$file_path = $file_path . basename($_FILES['image']['name']); 
if(move_uploaded_file($_FILES['image']['tmp_name'], $file_path)) { 
    echo "image success"; 
} else{ 
    echo "image fail"; 
} 

$file_path = $file_path . basename($_FILES['audio']['name']); 
if(move_uploaded_file($_FILES['audio']['tmp_name'], $file_path)) { 
    echo "audio success"; 
} else{ 
    echo "audio fail"; 
} 
?> 

но на сервере я могу увидеть только звуковой файл, файл изображения не удалось загрузки, я также пытался загрузить два файла изображения, он работал, но когда один аудиофайл и один файл изображения, файл изображения обычно не работает, любые предложения об этом? Заранее спасибо.

+0

Вы можете потреблять контент только сразу из объекта. Но у вас есть 'yourEntity.consumeContent();' и этот 'return yourEntity.getContent();' и больше. Поэтому я думаю, что поэтому excetchion – Raghunandan

+0

@Raghunandan, он работал при загрузке только одного файла, но когда я пытался загрузить два одновременно, был загружен только один файл, BTW, код был из [здесь] (http: //stackoverflow.com/questions/18964288/upload-a-file-through-an-http-form-via-multipartentitybuilder-with-a-progress/19188010#19188010) –

+0

i вы хотите параллельную загрузку, почему бы вам не использовать исполнителя? – Raghunandan

ответ

0

Я предлагаю вам следить за this. так как ваш MultipartEntity отличается и этот работает. Я пробовал. Счастливое кодирование!

try 
    { 
     HttpClient client = new DefaultHttpClient(); 

     HttpPost post = new HttpPost(URL); 

     MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 
     entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 

     entityBuilder.addTextBody(USER_ID, userId); 
     entityBuilder.addTextBody(NAME, name); 
     entityBuilder.addTextBody(TYPE, type); 
     entityBuilder.addTextBody(COMMENT, comment); 
     entityBuilder.addTextBody(LATITUDE, String.valueOf(User.Latitude)); 
     entityBuilder.addTextBody(LONGITUDE, String.valueOf(User.Longitude)); 

     if(file != null) 
     { 
      entityBuilder.addBinaryBody(IMAGE, file); 
     } 

     HttpEntity entity = entityBuilder.build(); 

     post.setEntity(entity); 

     HttpResponse response = client.execute(post); 

     HttpEntity httpEntity = response.getEntity(); 

     result = EntityUtils.toString(httpEntity); 

     Log.v("result", result); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
Смежные вопросы