2013-12-15 38 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"; 
} 
......... 

如果它有任何帮助,请认出我..感谢很多..

相关问题