【问题标题】:Retrofit file upload, objects are null on the server side改造文件上传,服务端对象为空
【发布时间】:2014-01-02 15:51:00
【问题描述】:

我想将本地 android 库中的照片发送到服务器 http Tomcat。对于我正在使用改造的通信。我已经建立了设备和服务器之间的连接,程序进入服务器功能,但参数中的所有对象都是空的。

这是客户端的设备函数声明:

@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;
    }
}

谁能帮我解释一下为什么进入服务器方法后的所有对象都是空的? 也许方法被错误地写入或 TypedFile 的 mime 字段被错误地选择,但我读到“multipart/mixed”mime 类型用于消息中包含各种类型的对象的消息。我没有任何想法,所以任何建议都会有所帮助。

【问题讨论】:

  • 我也有同样的问题...如果你已经知道了,你能分享一下解决方案吗?谢谢!
  • 你应该关注这个link来上传照片

标签: android file-upload multipart retrofit


【解决方案1】:

在创建 TypedFile 对象时尝试使用“image/*”作为 mime 类型。对于那个“部分”,它属于那个特定类型。 “混合”可能是整个提交,而不是文件的单个部分。

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

【讨论】:

    【解决方案2】:

    我也遇到了类似的问题,经过几个小时的尝试,我终于将图像上传功能构建到远程服务器。

    要上传图片,您需要正确创建API,还需要正确传递图片。

    这应该适合你:

    在 Retrofit 客户端中,您需要按如下方式设置图像:

    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 设置:

    @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";
    }
    .........
    

    如果对任何人有帮助,请认出我..非常感谢..

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 2018-10-10
      • 2017-01-31
      • 1970-01-01
      • 2012-03-19
      • 2019-09-17
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多