【问题标题】:Uploading an image to Google appengine using Robospice with Retrofit使用带有 Retrofit 的 Robospice 将图像上传到 Google appengine
【发布时间】:2013-10-18 07:14:35
【问题描述】:

我正在尝试使用带有 Retrofit 的 Robospice 将图像上传到我的 Google 应用引擎 blobstore。 我可以获取 GAE 提供的上传 URL,但是当我尝试将带有图像的 URL 作为 Multipart POST 发送时,我得到一个异常:

E//RequestRunner.java:134(24689): Thread-3363 请求网络执行期间发生异常:null

E//RequestRunner.java:134(24689): retrofit.RetrofitError

E//RequestRunner.java:134(24689): 在retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:343)

E//RequestRunner.java:134(24689): 在retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)

E//RequestRunner.java:134(24689): at $Proxy0.uploadImage(Native Method)

E//RequestRunner.java:134(24689): 在ginger.connexus.network.UploadImage.loadDataFromNetwork(UploadImage.java:24)

E//RequestRunner.java:134(24689): 在ginger.connexus.network.UploadImage.loadDataFromNetwork(UploadImage.java:1)

E//RequestRunner.java:134(24689): 在 com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:45)

E//RequestRunner.java:134(24689): at com.octo.android.robospice.request.RequestRunner.processRequest(RequestRunner.java:130)

E//RequestRunner.java:134(24689): at com.octo.android.robospice.request.RequestRunner$1.run(RequestRunner.java:197)

E//RequestRunner.java:134(24689): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)

E//RequestRunner.java:134(24689): at java.util.concurrent.FutureTask.run(FutureTask.java:234)

E//RequestRunner.java:134(24689): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)

E//RequestRunner.java:134(24689): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

E//RequestRunner.java:134(24689): at java.lang.Thread.run(Thread.java:841)

D//RequestProgressManager.java:75(24689):发送进度完成

我的 API 接口

public interface MyApi {
    @Multipart
    @POST("/{uploadurl}")
    MyImage uploadImage(
            @Path("uploadurl") String uploadurl,
            @Part("stream") long streamId,
            @Part("image") TypedFile image);
}

我的改造 Gson Spice 服务

public class MyService extends RetrofitGsonSpiceService {

    private final static String BASE_URL = "theinternet";

    @Override
    protected String getServerUrl() {
        return BASE_URL;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        addRetrofitInterface(MyApi.class);
    }

}

我的改装香料请求类

public class UploadImage extends RetrofitSpiceRequest<MyImage, MyApi> {

    private final String uploadurl;
    private final long streamId;
    private final TypedFile image;

    public UploadImage(String uploadurl, long streamId, File image) {
            super(MyImage.class, MyApi.class);
            this.uploadurl = uploadurl;
            this.streamId = streamId;
            this.image = new TypedFile("image/jpeg", image);
    }

    @Override
    public MyImage loadDataFromNetwork() throws Exception {
        return getService().uploadImage(uploadurl, streamId, image);
    }
}

我的执行调用

UploadImage upload = new UploadImage(uploadUrl, streamId, file);
getSpiceManager().execute(upload, new MyImageUploadListener());

【问题讨论】:

  • 你可以从浏览器上传带有restclient的图片吗?
  • 我可以像这样使用 curl 上传图片:curl -F "stream=5629499534213120" -F "image=@/path/to/image.jpg" upload-url
  • 您的堆栈跟踪不够详细。这个异常应该有一个原因,您可以清楚地看到出了什么问题。此错误可能来自您的 Retrofit 使用。
  • 我想我找到了一些东西。似乎 Retrofit 正在将我的上传 URL 中的“/”更改为“%2F”如何防止这种情况发生?
  • 您发现问题了吗?我也在使用改造来上传我的 blobstore 上的图片,但我的 path_success 是神经紧张的电话。我不明白为什么...如果您有任何想法,请帮助我。

标签: android google-app-engine image-uploading robospice retrofit


【解决方案1】:

尝试使用@EncodedPath 而不是@Path 并自己进行 URL 编码。

public interface MyApi {

    @Multipart
    @POST("/{uploadurl}")
    MyImage uploadImage(@EncodedPath("uploadurl") String uploadUrlEncoded,
            ... );
}

为了处理“%2F”问题,我会使用下一个 sn-p

String encodedValue = URLEncoder.encode(String.valueOf(uploadUrl), "UTF-8");
// URLEncoder encodes for use as a query parameter. Path encoding uses %20 to
// encode spaces rather than +. Query encoding difference specified in HTML spec.
// Any remaining plus signs represent spaces as already URLEncoded.
encodedValue = encodedValue.replace("+", "%20");
String uploadUrlEncoded = encodedValue.replace("%2F", "/");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 2018-04-11
    • 2022-01-18
    • 2011-02-26
    • 1970-01-01
    • 2021-03-18
    • 2016-09-25
    相关资源
    最近更新 更多