2013-12-15 36 views
2

我想從本地android庫發送照片到服務器http Tomcat。對於我正在使用改造的通訊。我建立了設備和服務器之間的連接,並且程序進入了服務器功能,但params中的所有對象都是空的。翻新文件上傳,服務器端的對象爲空

這是在客戶端設備函數聲明:

@Multipart 
@POST("/monument/photo/upload") 
void addMonumentPhoto(@Part("MonumentID") Integer monumentId, 
         @Part("name") String name, 
         @Part("subscript") String subscript, 
         @Part("photo") TypedFile photo, 
         Callback<Photo> callback); 

...這就是我把它叫做:

photo = _resizePhoto(new File(monument.getUriZdjecie())); 
typedFile = new TypedFile("multipart/mixed", photo); 
//long bytes = photo.length(); 

    if (photo.exists()) { 
     MonumentsUtil.getApi().addMonumentPhoto(monument.getIdZabytek(), 
      "podpis", 
      "Main photo", 
      typedFile, 
      new Callback<Photo>() { 
      @Override 
      public void success(Photo aPhoto, Response response) { 

        monument.setUriZdjecie(aPhoto.getUri()); 

        MonumentsUtil.getApi().addMonument(monument.getNazwa(), 
              monument.getOpis(), 
              monument.getDataPowstania(), 
              monument.getWojewodztwo(), 
              monument.getUriZdjecie(), 
              monument.getMiejscowosc(), 
              monument.getKodPocztowy(), 
              monument.getUlica(), 
              monument.getNrDomu(), 
              monument.getNrLokalu(), 
              monument.getKategoria(), 
              monument.getLatitude(), 
              monument.getLongitude(), 
              new MonumentsCallback()); 
      } 
      @Override 
      public void failure(RetrofitError retrofitError) { 
       Log.e(TAG, retrofitError.getMessage()); 
      } 
    }); 
} 

和服務器的方法:

@RequestMapping(value = "/monument/photo/upload") 
public 
@ResponseBody 
Photo requestMonumentPhotoAdd(@RequestParam(value = "MonumentID", required = false) Integer monumentId, 
           @RequestParam(value = "name", required = false) String name, 
           @RequestParam(value = "subscript", required = false) String subscript, 
           @RequestParam(value = "photo", required = false) MultipartFile file, 
           HttpServletRequest request) { 

    Photo photo = new Photo(); 
    if (monumentId != null) 
     photo.setIdZabytek(monumentId); 
    photo.setUri(URL + "/images/" + name); 
    photo.setPodpis(subscript); 
    photo = monumentsRepo.addPhoto(photo); 
    String filePath = "D:\\Projects\\Images\\" + monumentId + "_" + photo.getIdZjecia(); 

    if (file != null) { 
     if (!file.isEmpty()) { 
      try { 
       byte[] bytes = file.getBytes(); 
       BufferedOutputStream stream = 
         new BufferedOutputStream(new FileOutputStream(new File(filePath))); 
       stream.write(bytes); 
       stream.close(); 
       photo.setUri(filePath); 
       monumentsRepo.updatePhoto(photo); 
       return photo; 
      } catch (Exception e) { 
       return null; 
      } 
     } else { 
      return null; 
     } 
    } 
    else { 
     return null; 
    } 
} 

任何人都可以幫助我,解釋爲什麼所有對象在geting到服務器方法後都是空的? 也許方法是wrogly書寫或MIME字段的TypedFile是wrogly選擇,但我讀到,「多部分/混合」MIME類型是消息中包含各種類型的對象的消息。我沒有任何想法,所以任何建議都會有所幫助。

+0

我有同樣的問題......你可以分享的解決方案,如果你知道它已經?謝謝! –

+0

Yeaj任何解決方案? – Lion789

+0

你應該按照這個[鏈接](http://stackoverflow.com/questions/30810829/uploading-compress-image-to-server-using-retrofit?answertab=votes#tab-top)上傳照片 –

回答

1

嘗試創建TypedFile對象以使用「image/*」作爲您的MIME類型。對於那個「部分」,它是屬於這種特定類型的。 「混合」可能是整個提交,而不是文件的單個部分。

typedFile = new TypedFile("image/*", photo);

0

我也有過類似的問題,並嘗試後,我幾個小時,終於建成了圖片上傳功能,遠程服務器。

要上傳圖片,您需要正確創建API,並且還需要正確傳遞圖片。

這應該對你罰款:

在改造客戶端,您需要設置圖像如下:

String photoName = "20150219_222813.jpg"; 
File photo = new File(photoName); 
TypedFile typedImage = new TypedFile("application/octet-stream", photo); 


RetrofitClient.uploadImage(typedImage, new retrofit.Callback<Photo>() { 

      @Override 
      public void success(Photo photo, Response response) { 
       Log.d("SUCCESS ", "SUCCESS RETURN " + response); 
      } 

      @Override 
      public void failure(RetrofitError error) { 

      } 
     }); 

API SET UP:

@Multipart 
@POST("/") 
void uploadImage(@Part("file") TypedFile file, Callback<Photo> callback); 

遠程服務器端PHP處理圖像的代碼:

........ 
$pic = 'uploaded_images/' . $imagename . '.jpg'; 
if (!move_uploaded_file($_FILES['file']['tmp_name'], $pic)) { 
    echo "posted"; 
} 
......... 

如果它有任何幫助,請認出我..感謝很多..

相關問題