Struts2操作表单数据使用Base64上传图像的最大大小

时间:2015-11-13 17:50:57

标签: javascript java struts2 base64 httprequest

我有一个Struts2操作,它接收一个包含Base64图像的字符串和另一个图像名称字符串。

一切适用于小尺寸图像。但是当我尝试发送更大的图像时,在动作实现中将Base64和图像名称字符串设置为null。

在搜索解决方案时,我发现文件上传的默认最大大小为2 MB。可以使用以下属性增加此限制:

<constant name="struts.multipart.maxSize" value="104857600" />

<param name="maximumSize">52428800</param>

<param name="fileUpload.maximumSize">52428800</param>

然而这不起作用。可能这个实现不是文件上传,而是双字符串POST请求。

有没有办法可以增加帖子请求的大小?或问题是别的什么?

public class GalleryAction  extends BaseAction {

private String imageBase64;

private String imageName;

...

public final String uploadOperation() throws Exception {

    if (this.imageBase64 == null || this.imageBase64.length() == 0
            || this.imageName == null || this.imageName.length() == 0) {
        throw new Exception("Invalid argument");
    }
    byte[] decodedBytes = Base64Decoder.decode2bytes(this.imageBase64);
    InputStream is = new ByteArrayInputStream(decodedBytes);

    Graphics graphics = MGraphics.insertImageToDataBase(this.imageName, is);

    // Issue server to sync image.
    RestUtils.syncImage(graphics.getId());

    JSONObject response = new JSONObject();

    response.put("statusCode", "0");
    jsonString  = response.toString();

    return JSON_RESPONSE;
}

...
}

编辑: 我忘了发布图片上传的代码。

Gallery.prototype.upload = function(base64, imageName) {
var galleryObject = this;

galleryObject.loadingCallback(true);

$.post(this.urlBase + "/upload", {
    "imageBase64" : base64.match(/,(.*)$/)[1],
    "imageName" : imageName
}, function(data) {
    galleryObject.handlerErrorMessageCallback();

    galleryObject.loadingCallback(false);

    galleryObject.refreshImageGalleryCallback();

}, "json")

.fail(function() {
    galleryObject.handlerErrorMessageCallback("error.upload.image");

    galleryObject.loadingCallback(false);

});
}

2 个答案:

答案 0 :(得分:1)

HTTP协议规范不对POST消息的大小设置限制。但是,您的应用程序服务器会执行此操作(主要是为了防止DDoS攻击)。

通常这个阈值是10兆字节,它就是你要击中的那个。然后,您应该能够根据您的AS规格自定义此设置。

尽管如此,这并不鼓励,并可能导致安全漏洞。

最好的事情是:

  1. 使用multipart/form-data而不是application/x-www-form-urlencoded;

  2. 使用File代替String,因为您上传的内容是文件,而不是字符串。

答案 1 :(得分:0)

我将上传方法更改为表格数据。

Gallery.prototype.upload = function(base64, imageName) {

var galleryObject = this;
galleryObject.loadingCallback(true);

var request = new FormData();                   
request.append("imageBase64", base64.match(/,(.*)$/)[1]);
request.append("imageName", imageName);

$.ajax({url:this.urlBase + "/upload",
    data: request,
    type: "POST",
    processData: false,
    contentType: false,
    success: function(result)
        {
            galleryObject.handlerErrorMessageCallback();
            galleryObject.loadingCallback(false);
            galleryObject.refreshImageGalleryCallback();
        }
}).fail(function() {
    galleryObject.handlerErrorMessageCallback("error.upload.image");
    galleryObject.loadingCallback(false);
});
}

使用此post方法,strus.xml上的以下属性必须存在

<constant name="struts.multipart.maxSize" value="104857600" />