Play Framework: публикация изображения в imageshack с помощью WS - PullRequest
4 голосов
/ 02 января 2012

Я пытаюсь POST преобразовать изображение в imageshack, используя их API и объект WSRequest Play Framework.

Мой код выглядит следующим образом:

public static void upload( Picture picture ) throws Exception {

    //set file parameter - in this case the image
    WS.FileParam fp = new WS.FileParam( picture.asFile, "fileupload");

    //set other parameters
    Map<String,Object> params = new HashMap<String, Object>();
    params.put( "optsize", "resample" );
    params.put( "rembar", "yes" );
    params.put( "public", "no" );
    params.put( "a_username", username );
    params.put( "a_password", password );
    params.put( "key", a_key );

    //POST request
    Document doc = WS.url( "http://www.imageshack.us/upload_api.php" )
        .setHeader( "Content-Type", picture.contentType )
        .mimeType( "multipart/form-data" )
        .params( params )
        .files( fp )
        .post()
        .getXml();
}

Однако я всегда получаю следующий ответ от imageshack:

Извините, но мы обнаружили, что получены неожиданные данные. Обязательный параметр 'fileupload' отсутствует или ваше сообщение не является multipart / form-data.

Я попытался отправить файл в качестве параметра, используя байтовый массив:

params.put( "fileupload", Base64.encode( picture.asBytes )  )

Но это также приводит к тому же ответу от Imageshack.

Это сводит меня с ума. Может кто-нибудь указать, где я иду не так или, возможно, указать мне в направлении лучшего решения? Спасибо.

<Ч />

причина

После небольшого исследования я обнаружил, что я упустил немного важной информации из этого вопроса ... Я включаю модуль Google App Engine в свое приложение.

Согласно Google Framework от Google Framework код, связанный с присоединением файлов к запросу WS при использовании GAE, фактически закомментирован. Следовательно, причина, по которой это просто не работает. Так что вам не выдадут ошибки и никаких указаний на то, что это не сработает ... вам просто нужно разобраться с этим.

Я принял ответ @ Gary, поскольку это правильный способ загрузки изображения в imageshack с помощью WS - только не при использовании GAE.

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Не думаю, что вам нужно указывать тип содержимого или тип mime напрямую.

Я использовал следующий код для успешной загрузки.

WS.FileParam fp = new WS.FileParam(
      new File("d:\\workspace\\ImageShackTest\\sample_picture.png"), "fileupload");

    Map<String,Object> params = new HashMap<String, Object>();
    params.put( "optsize", "resample" );
    params.put( "rembar", "yes" );
    params.put( "public", "yes" );
    //params.put( "a_username", username );
    //params.put( "a_password", password );
    params.put( "key", API_KEY );

    //POST request
    Document doc = WS.url( "http://www.imageshack.us/upload_api.php" )
        .params( params )
        .files( fp )
        .post()
        .getXml();

Я думаю, что когда вы прикрепляете файл к запросу, он автоматически решает, что он будет multipart / form-data.

Это весь мой контроллер (кроме ключа API)

package controllers;

import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
import play.libs.*;
import java.io.File;

public class Application extends Controller {

    public static void index() { render(); }

    private static final String API_KEY = "API KEY REMOVED TO PROTECT THE INNOCENT";

    public static void tryUpload() {
        WS.FileParam fp = new WS.FileParam( new File("d:\\workspace\\ImageShackTest\\sample_picture.png"), "fileupload");

        Map<String,Object> params = new HashMap<String, Object>();
        params.put( "optsize", "resample" );
        params.put( "rembar", "yes" );
        params.put( "public", "yes" );
        params.put( "key", API_KEY );

        String doc = WS.url( "http://www.imageshack.us/upload_api.php" )
            .params( params )
            .files( fp )
            .post()
            .getString();

        System.out.println(doc);

        index();
    }
}

, а это файл application.conf

# This is the main configuration file for the application.
# ~~~~~
application.name=ImageShackTest
application.mode=dev
%prod.application.mode=prod
application.secret=JIVQE8y3y1lCzXRGprFJvoXBdi8Jpa8qE1U1mBIooLLOOYk5yyhAI5cxbEf4q4pl
date.format=yyyy-MM-dd
attachments.path=data/attachments
mail.smtp=mock

Я не внес никаких других изменений.Просто перейдите к http://localhost:9000/Application.tryUpload и можете увидеть успешный XML на игровой консоли.

0 голосов
/ 02 января 2012

Вы неправильно указали заголовок типа контента.

Вместо этого:

.setHeader( "Content-Type", picture.contentType )

Попробуйте это:

.setHeader( "Content-Type", "multipart/form-data" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...