1

我正在尝试使用 REST Web 服务将文件上传到 Web。我创建了一个流程,它接受以下形式的文件:

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(

        @FormDataParam("file") InputStream uploadInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetails,
        @FormDataParam("location") String uploadedFileLoc   ) {
        .
        .
}

在方法结束时,我需要返回客户端上传的文件,并在下一个方法中将该文件转换为字节数组。基本上我以“InputStream”格式获取文件。有什么方法可以作为文件本身获得吗?

4

4 回答 4

2

@Ravi Kumar

您可以使用

public Response uploadFileSimple(@FormDataParam("file") File file, @FormDataParam("file") FormDataContentDisposition formData)

它直接返回一个文件对象,但球衣它会在临时文件中为你创建文件对象,所以你可以说有两个相同大小的临时文件。

First MIMExxxxx.tmp from where you get you input steam

Second re234xxxx  from which you get this file object

NOTE :在调用你的资源方法之前 jersey 需要时间来创建这两个文件(根据文件大小)。

如果你想直接使用MIMExx.tmp文件,那么我认为没有直接的方法可以JAVA REFLECTION用来获取临时文件路径和使用。

使用 Java 反射:

@Path("/upload/{parentfolderid}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFileWithPart(FormDataMultiPart form)
    {

        try
        {
            FormDataBodyPart filePart = form.getField("upload");
            BodyPartEntity bodyPart = (BodyPartEntity) filePart.getEntity();

            MIMEPart mimePart = (MIMEPart) readFieldValue("mimePart", bodyPart);
            Object dataHead = readFieldValue("dataHead", mimePart);
            Object dataFile = readFieldValue("dataFile", dataHead);
            File tempFile = null;
            if (dataFile != null)
            {
                Object weakDataFile = readFieldValue("weak", dataFile);
                tempFile = (File) readFieldValue("file", weakDataFile);
            }
            else
            {
                tempFile = filePart.getValueAs(File.class);
            }

    // Here is your *tempFile*, Do what ever you want with it
}

private static Object readFieldValue(String fieldName, Object o) throws Exception
{
    Field field = o.getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
    return field.get(o);
}
于 2014-09-24T06:47:01.830 回答
0

文件是文件,流是流。

如果您需要流中的文件,则需要创建文件并将流写入文件。

您可以为此使用临时文件夹: How to create a temp file in java without the random number appended to the filename?

并在那里创建一个临时文件。

UPD

对于您的需要, File.createTempFile() 应该足够了。

于 2013-04-15T13:44:31.180 回答
0

您可以使用 Jersey REST API 进行文件上传。例如,

@Path("/upload")
public class FileUploadService{
      @POST

@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream,
    @FormDataParam("file") FormDataContentDisposition fileDetail) {

      String location = "/" + fileDetail.getFileName();

    // save it
    writeToFile(uploadedInputStream, location);

    String output = "File uploaded to : " + location;

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

      }

}

要保存文件,您可以使用以下方法:

private void writeToFile(InputStream uploadedInputStream,
    String location) {

    try {
        OutputStream out = new FileOutputStream(new File(
                location));
        int read = 0;
        byte[] bytes = new byte[1024];

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

        e.printStackTrace();
    }

}

希望能帮助到你!

于 2013-04-15T13:59:04.240 回答
0

谢谢大家的建议。我需要做的主要事情是将文件转换为字节数组。由于我得到了 InputStream,我可以将其作为返回传递给下一个流,而不是等待文件本身。在下一个流程中,不要使用“文件到字节数组”转换器,而是使用“对象到字节数组”转换器。最后它起作用了。

于 2013-04-17T09:25:37.657 回答