使用JAX-RS的FileUpload [英] FileUpload with JAX-RS

查看:134
本文介绍了使用JAX-RS的FileUpload的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试从JavaScript客户端上传文件到JAX-RS Java服务器。



我在服务器上使用以下REST上传功能:

  @POST 
@Produces('application / json')
UploadDto上传(
@Context HttpServletRequest请求,
@QueryParam(cookie)字符串cookie){
$ b $ def contentType
字节[] fileBytes

log.debugupload - cookie :+ cookie

尝试{
if(请求instanceof MultipartHttpServletRequest){
log.debugrequest instanceof MultipartHttpServletRequest

MultipartHttpServletRequest myrequest = request
CommonsMultipartFile file =(CommonsMultipartFile)myrequest.getFile('file')
fileBytes = file.bytes
contentType = file.contentType
log.debug>>>> ;>以字节为单位上传文件的大小:+ file.size
}
(请求instanceof SecurityContextHolderAwareRequestWrapper){
log.debugrequest instanceof SecurityContextHolderAwareRequestWrapper

SecurityContextHolderAwareRequestWrapper myrequest =请求

//获取上传文件的inputStream
InputStream inputStream = myrequest.inputStream

fileBytes = IOUtils.toByteArray(inputStream);
contentType = myrequest.getHeader(Content-Type)
log.debug>>>>>>>上传文件大小的字节:+ fileBytes.size()

else {
log.error请求不是MultipartHttpServletRequest或SecurityContextHolderAwareRequestWrapper
printlnrequest:+ request.class
}
}
catch(IOException e){
log.error(upload()无法保存文件错误:,e)
}
}


  code> var str2ab_blobreader = function(str,callback){
var blob;
BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder
|| window.BlobBuilder;
if(typeof(BlobBuilder)!=='undefined'){
var bb = new BlobBuilder();
bb.append(str);
blob = bb.getBlob();
} else {
blob = new Blob([str]);
}
var f = new FileReader();
f.onload = function(e){
callback(e.target.result)
}
f.readAsArrayBuffer(blob);
}

var fileName =fileName.jpg;
var contentType =image / jpeg;
if(file.type.toString()。toLowerCase()。indexOf(png)> -1){
fileName =fileName.png;
contentType =image / png;
}

var xhrNativeObject = new XMLHttpRequest();
var urlParams =?test = 123;
xhrNativeObject.open(post,url + urlParams,true);
xhrNativeObject.setRequestHeader(Content-Type,contentType);

xhrNativeObject.onload = function(event){

var targetResponse = event.currentTarget; ((targetResponse.readyState == 4)
&&(targetResponse.status == 200)){
var obj = JSON.parse(targetResponse.responseText);
console.log(obj.uploadImageId);
} else {
console.log(fail);



var buffer = str2ab_blobreader(file,function(buf){
xhrNativeObject.send(buf);
});

当我在我的Grails控制器中使用代码时,它运行良好,但是当我在REST资源中使用它时我总是得到:请求不是MultipartHttpServletRequest或SecurityContextHolderAwareRequestWrapper

日志输出是

  request:com.sun.proxy。$ Proxy58 

从JavaScript发送文件blob我使用> XMLHttpRequest ,其中包含正文中的blob和一些查询参数。

我该如何制作JAX-RS文件上传工作?我如何收到一些额外的查询参数与我的POST请求?

解决方案

在服务器端,您可以使用类似这个

  @POST 
@Path(/ fileupload)//您的路径或URL调用此服务
@Consumes(MediaType.MULTIPART_FORM_DATA)
public response uploadFile(
@DefaultValue(true)@FormDataParam(enabled)boolean enabled,
@FormDataParam(file) InputStream uploadedInputStream,
@FormDataParam(file)FormDataContentDisposition fileDetail){
//您要存储文件的本地磁盘路径
String uploadedFileLocation =D:// uploadedFiles / + fileDetail.getFileName();
System.out.println(uploadedFileLocation);
//保存
文件objFile = new File(uploadedFileLocation);
if(objFile.exists())
{
objFile.delete();

}

saveToFile(uploadedInputStream,uploadedFileLocation);

字符串输出=通过基于Jersey的RESTFul Webservice上传的文件:+ uploadedFileLocation;

return Response.status(200).entity(output).build();

$ b private void saveToFile(InputStream uploadedInputStream,
String uploadedFileLocation){

try {
OutputStream out = null;
int read = 0;
byte [] bytes = new byte [1024];

out = new FileOutputStream(new File(uploadedFileLocation)); ((read = uploadedInputStream.read(bytes))!= -1){
out.write(bytes,0,read);
while
}
out.flush();
out.close();
} catch(IOException e){

e.printStackTrace();
}

}

这可以用客户端代码在Java中与

  public class TryFile {
public static void main(String [] ar)
抛出HttpException,IOException,URISyntaxException {
TryFile t = new TryFile();
t.method();
}
public void method()抛出HttpException,IOException,URISyntaxException {
String url =http:// localhost:8080 /...../ fileupload; //你的服务URL
String fileName =; //要上传的文件名
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
FileBody fileContent = new FiSystem.out.println(hello);
StringBody comment = new StringBody(Filename:+ fileName);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart(file,fileContent);
httppost.setEntity(reqEntity);

HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();




$ b $ p
$ b

使用HTML,你可以简单地检查这段代码

 < html> 
< body>
< h1>使用RESTFul WebService上传文件< / h1>
< form action =< Your service URL(htp:// localhost:8080 /.../ fileupload)method =postenctype =multipart / form-data>
< p>
选择一个文件:< input type =filename =file/>
< / p>
< input type =submitvalue =上传/>
< / form>




QueryParam,Check @QueryParam或头部参数使用@HeaderParam



@QueryParam示例



@HeaderParam的示例



试试这个,希望这可以帮助你问题。


I try to do file upload from a JavaScript client to a JAX-RS Java server.

I use the following REST upload function on my server:

@POST
@Produces('application/json')
UploadDto upload(
        @Context HttpServletRequest request,
        @QueryParam("cookie") String cookie) {

    def contentType
    byte [] fileBytes

    log.debug "upload - cookie: "+cookie

    try{
        if (request instanceof MultipartHttpServletRequest) {
            log.debug "request instanceof MultipartHttpServletRequest"

            MultipartHttpServletRequest myrequest = request
            CommonsMultipartFile file = (CommonsMultipartFile) myrequest.getFile('file')
            fileBytes = file.bytes
            contentType = file.contentType
            log.debug ">>>>> upload size of the file in byte: "+ file.size
        }
        else if (request instanceof SecurityContextHolderAwareRequestWrapper) {
            log.debug "request instanceof SecurityContextHolderAwareRequestWrapper"

            SecurityContextHolderAwareRequestWrapper myrequest = request

            //get uploaded file's inputStream
            InputStream inputStream = myrequest.inputStream

            fileBytes = IOUtils.toByteArray(inputStream);
            contentType = myrequest.getHeader("Content-Type")
            log.debug ">>>>> upload size of the file in byte: "+ fileBytes.size()
        }
        else {
            log.error "request is not a MultipartHttpServletRequest or SecurityContextHolderAwareRequestWrapper"
            println "request: "+request.class
        }
    }
    catch (IOException e) {
        log.error("upload() failed to save file error: ", e)
    }
}

On the client side I send the file as follows:

var str2ab_blobreader = function(str, callback) {
    var blob;
    BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder
            || window.BlobBuilder;
    if (typeof (BlobBuilder) !== 'undefined') {
        var bb = new BlobBuilder();
        bb.append(str);
        blob = bb.getBlob();
    } else {
        blob = new Blob([ str ]);
    }
    var f = new FileReader();
    f.onload = function(e) {
        callback(e.target.result)
    }
    f.readAsArrayBuffer(blob);
}

var fileName = "fileName.jpg";
var contentType = "image/jpeg";
if (file.type.toString().toLowerCase().indexOf("png") > -1) {
    fileName = "fileName.png";
    contentType = "image/png";
}

var xhrNativeObject = new XMLHttpRequest();
var urlParams = ?test=123;
xhrNativeObject.open("post", url + urlParams, true);
xhrNativeObject.setRequestHeader("Content-Type", contentType);

xhrNativeObject.onload = function(event) {

    var targetResponse = event.currentTarget;
    if ((targetResponse.readyState == 4)
            && (targetResponse.status == 200)) {
        var obj = JSON.parse(targetResponse.responseText);
        console.log(obj.uploadImageId);
    } else {
        console.log("fail");
    }
}

var buffer = str2ab_blobreader(file, function(buf) {
    xhrNativeObject.send(buf);
});

When I use the code in my Grails Controller it worked well but when I use it in a REST Resource I always get: request is not a MultipartHttpServletRequest or SecurityContextHolderAwareRequestWrapper

The log output is

request: com.sun.proxy.$Proxy58

The send a file blob from JavaScript I use XMLHttpRequest which contains the blob in the body and some query parameters.

How can I make JAX-RS file upload working? How do I receive some additional query params with my POST request?

解决方案

On Server Side you can use something like this

@POST
@Path("/fileupload")  //Your Path or URL to call this service
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
        @DefaultValue("true") @FormDataParam("enabled") boolean enabled,
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {
     //Your local disk path where you want to store the file
    String uploadedFileLocation = "D://uploadedFiles/" + fileDetail.getFileName();
    System.out.println(uploadedFileLocation);
    // save it
    File  objFile=new File(uploadedFileLocation);
    if(objFile.exists())
    {
        objFile.delete();

    }

    saveToFile(uploadedInputStream, uploadedFileLocation);

    String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;

    return Response.status(200).entity(output).build();

}
private void saveToFile(InputStream uploadedInputStream,
        String uploadedFileLocation) {

    try {
        OutputStream out = null;
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
    } catch (IOException e) {

        e.printStackTrace();
    }

}

Again this can be checked with the client code in java with

public class TryFile {
public static void main(String[] ar)
       throws HttpException, IOException, URISyntaxException {
    TryFile t = new TryFile();
    t.method();
}
public void method() throws HttpException, IOException, URISyntaxException {
    String url = "http://localhost:8080/...../fileupload";  //Your service URL
    String fileName = ""; //file name to be uploaded
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    FileBody fileContent = new FiSystem.out.println("hello");
    StringBody comment = new StringBody("Filename: " + fileName);
    MultipartEntity reqEntity = new MultipartEntity();
    reqEntity.addPart("file", fileContent);
    httppost.setEntity(reqEntity);

    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();
}
}

With HTML, you can simply check with this code

<html>
<body>
<h1>Upload File with RESTFul WebService</h1>
<form action="<Your service URL (htp://localhost:8080/.../fileupload)" method="post" enctype="multipart/form-data">
   <p>
    Choose a file : <input type="file" name="file" />
   </p>
   <input type="submit" value="Upload" />
</form>

To get QueryParam, Check @QueryParam or for header param use @HeaderParam

Example of @QueryParam

Example of @HeaderParam

Try this, hope this helps you with your problem.

这篇关于使用JAX-RS的FileUpload的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆