繁体   English   中英

Play Framework:使用WS将图像发布到imageshack

[英]Play Framework: Post image to imageshack using WS

我想POST图像使用到ImageShack的他们的API和播放框架的WSRequest对象。

我的代码如下:

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中得到以下回应:

我尝试使用字节数组将文件作为参数发送:

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

但这也导致了Imageshack的相同反应。

这让我很生气。 任何人都可以指出我出错的地方或者可能指向更好的解决方案吗? 谢谢。


原因

经过一番研究后,我发现我忽略了这个问题中的一些重要信息....我在我的应用程序中包含了Google App Engine模块。

根据Play Framework Google Group ,使用GAE时将文件附加到WS请求的代码实际上只是注释掉了。 因此它不起作用的原因。 所以没有错误为你抛出,也没有迹象表明它为什么不起作用......你只需要解决它。

我接受了@Gary的回答,因为这是使用WS将图像上传到ima​​geshack的正确方法 - 只是在使用GAE时没有。

我认为您不需要直接指定内容类型或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();

我认为当您将文件附加到请求时,它会自动决定它将是多部分/表单数据。

这是我的整个控制器(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。

您正在错误地设置内容类型标头。

而不是这个:

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

尝试这个:

.setHeader( "Content-Type", "multipart/form-data" )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM