【问题标题】:Can't manage to POST image in multipart-form无法以多部分形式发布图像
【发布时间】:2015-06-29 16:36:46
【问题描述】:

我正在尝试将 camfind 用于 Android 应用程序,并对所有请求使用改造等。我发现使用多部分表单数据将图像文件上传到服务器时遇到了巨大的困难。你能解决这个问题吗?

我的代码:

public class getCamFind {
//Set constants
private static final String TAG = MainActivity.class.getSimpleName();
private static final String API_URL = "https://camfind.p.mashape.com";

//creates object getCamFind, sends request and gets answer
static void getCamResult(String path) throws IOException {

    File imageFile = new File(path); //THIS FILE EXISTS AND SD IS MOUNTED


    String language = new String("en_US");
    String keyMashape = "XXX";


    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            //.setRequestInterceptor(new SessionRequestInterceptor())
            .build();



    // Create an instance of our API interface.
    CamFind camFind = restAdapter.create(CamFind.class);

    camFind.send(keyMashape, language, new TypedFile("image/jpeg", imageFile), new Callback<resultClass>() {
        @Override
        public void success(resultClass result, Response response) {
            Log.d(TAG, response.toString());
            Log.d(TAG, result.getStatus());
            Log.d(TAG, response.getBody().toString());
        }

        @Override
        public void failure(RetrofitError retrofitError) {
            Log.d(TAG, "Error : " + retrofitError.getMessage());
        }
    });
}

static class Contributor {
    String login;
    int contributions;
}


//interface of the object getCamFind
interface CamFind {

    @Multipart
    @POST("/image_requests")

    void send(
            @Header("X-Mashape-Key") String keyMashape,
            @Part("image_request[locale]") String language,
            @Part("image_request[image]") TypedFile imageFile,

            //@Field("image_request[remote_image_url]") String URL,
            Callback<resultClass> callback);

}

private class resultClass{
    String name;
    String status;

    public String getName(){return this.name;}
    public String getStatus(){return this.status;}


}


}

当我以这种方式发送时,它显示"{"error": {"image": ["invalid image format"]}}",当我使用文件而不是键入文件发送时,它显示"image": ["can't be blank"]。

这可能有用,它是我使用cloudsight POST 的改造日志(基本上与使用mashape 完全相同,请求相同):

        06-29 16:59:43.866    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ ---> HTTP POST https://api.cloudsightapi.com/image_requests
    06-29 16:59:43.866    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Authorization: CloudSight XXX
    06-29 16:59:43.866    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Content-Type: multipart/form-data; boundary=ac3731a5-466f-4baf-87d1-b21fddc41701
    06-29 16:59:43.866    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Content-Length: 531
    06-29 16:59:43.879    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ --ac3731a5-466f-4baf-87d1-b21fddc41701
    Content-Disposition: form-data; name="image_request[locale]"
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 5
    Content-Transfer-Encoding: binary
    en_US
    --ac3731a5-466f-4baf-87d1-b21fddc41701
    Content-Disposition: form-data; name="image_request[image]"; filename="JPEG_20150627_231626_1086927409.jpg"
    Content-Type: image/jpeg
    Content-Length: 0
    Content-Transfer-Encoding: binary
    --ac3731a5-466f-4baf-87d1-b21fddc41701--
    06-29 16:59:43.880    2483-2502/bookshotco.bookshot2 D/Retrofit﹕ ---> END HTTP (531-byte body)

这也可能有用(查看“image_requests”部分):http://cloudsight.readme.io/v1.0/docs/testinput

【问题讨论】:

    标签: java android retrofit mashape cloudsight


    【解决方案1】:

    正如您在documentation of retrofit 中看到的,构造函数的第一个参数不是文件的路径。

    TypedFile(String mimeType, File file)
    Constructs a new typed file.
    

    这是 mimetype。试试

    new TypedFile("image/png", imageFile) 
    

    或

    new TypedFile("image/jpeg", imageFile)
    

    【讨论】:

    • 这是一个愚蠢的错误,谢谢!再次尝试,但仍然无法正常工作(完全相同的错误)
    • 你可以试试“application/octet-stream”作为mimetype吗?
    • 在您发布的日志文件中,它是 Content-Length: 0。jpeg 文件是否有任何字节?您可以记录 file.length() 以确保这一点吗?
    • 我以为是上传问题,但您似乎是对的,文件长度为零。该死的。谢谢,我现在就弄清楚是什么问题。
    • 有效!!谢谢 !不敢相信我犯了这样一个初学者的错误哈哈
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2014-11-21
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多