gpt4 book ai didi

java - JAX-RS 文件下载,多种内容类型

转载 作者:行者123 更新时间:2023-12-04 17:17:57 24 4
gpt4 key购买 nike

让我先提供一些背景信息。我正在开发一个与 Microsoft SharePoint 2010 集成的系统,这并不是真正的 SharePoint 作为系统,而是它的文件系统、文档库等的虚拟表示...用户将文件上传到 SharePoint,我的系统监视这些文件并为它们编制索引进入搜索引擎(包括文件内容)。用户可以通过 REST 接口(interface)与该系统进行交互。

我创建了一个 REST 接口(interface)来为用户获取与我的搜索引擎中某个条目对应的文件。这使用绝对网络路径作为其标识符。一个例子是 //corporateserver//library1/filex.docx。由于同源政策,我无法在客户端加载此文件。因此,我试图通过服务器传输它。

我使用 JAX-RS 传输数据取得了一些成功,但是,我遇到了以下问题:

用户希望下载的文件可以是多种内容类型,其中大部分是microsoft office 格式。我查看了已注册的 MIME 类型列表,发现 application/mswordapplication/vnd.ms-powerpoint

我的问题:是否有包含 Microsoft Office 文件的内容类型?如果不是,如何才能将正确的内容类型与所请求的文件相匹配。如果服务器内容类型为 text/plain 的 word 文件会怎样?

如能提供有关该主题的任何帮助,我们将不胜感激。

编辑

我用来传输数据的代码:

package com.fujitsu.consensus.rest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;

import org.apache.commons.io.IOUtils;
import org.codehaus.jettison.json.JSONException;

@Path("/fetcher")
public class FetcherService {

@GET
@Path("/fetch")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response fetchFile(@QueryParam("path") String path)
throws JSONException, IOException {

final File file = new File(path);
System.out.println(path);

StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException {
try {
output.write(IOUtils.toByteArray(new FileInputStream(file)));
} catch (Exception e) {
e.printStackTrace();
}
}
};

return Response.ok(stream, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "inline; filename=\"" + file.getName() + "\"")
.build();
}
}

JavaScript 代码:

 $.ajax({
url: "../rest/fetcher/fetch",
type: "GET", //send it through get method
data:{path:obj.id},
success: function(response) {
console.log(response);},
error: function(xhr) {//Do Something to handle error}
});

我在客户端得到的响应:

response on client side

编辑 2

我已经添加了一个 HTTP 跟踪作为 header 和数据实际上正在传输的证据,但是没有显示下载对话框。

Content-Disposition header 似乎不适用于内联或附件。

HTTP trace result

最佳答案

您可以使用 application/octet-stream 作为内容类型并执行以下操作来下载文件:

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadFile(String fileName) {
File file = ... // Find your file
return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"")
.build();
}

由于您正在使用 JavaScript 下载文件,请查看 herehere .

关于java - JAX-RS 文件下载,多种内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com