生成临时的公共访问文件和访问它的URL

时间:2016-06-14 10:52:29

标签: java spring-mvc

我在oracle数据库中将几个文件存储为Blob。我渲染一个列表,向用户显示存储的文件,我想给他一个下载每个文件的链接。所以我在一个函数中思考,让我从存储在数据库中的字节流生成临时文件,并使用临时URL让用户下载该文件。伪代码的方式是这样的:

File tempFile = generateTempFileFrom(bytes[]);
String tempUrl = generateTempUrlFromTempFile(tempFile);

所以我能做到;

<a href="tempUrl">filename</a>

正如我所说,那个伪代码,只是想让你知道我想做什么。

1 个答案:

答案 0 :(得分:2)

早上好,

您无需创建任何文件,只需将BLOB转换为Byte数组并将其发送回您的Web客户端。

例如,使用Spring 4: 我在GET / download / {id}上创建了一个控制器。

@Controller
public class BlobController {

    @RequestMapping("/download/{id}")
    public HttpEntity<byte[]> download(@PathVariable String id) {

        // JDBC code to retrieve the BLOB column
        stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT FILENAME, FILETYPE, CONTENT FROM MY TABLE WHERE ID = " + id);
        Blob blob = rs.getBlob("CONTENT");
        String fileName= rs.getString("FILENAME"); // ex. file1
        String fileType= rs.getString("FILETYPE"); // ex. pdf

        // Transform BLOB to Byte array
        int blobLength = (int) blob.length();  
        byte[] document = blob.getBytes(1, blobLength);


        // Set HTTP Header to force the browser to open the download popup
        HttpHeaders header = new HttpHeaders();
        header.setContentType(new MediaType("application", fileType));
        header.set("Content-Disposition", "attachment; filename=" + file1 + "." + fileType);
        header.setContentLength(blobLength );

        //release the blob and free up memory. (since JDBC 4.0)
        blob.free();

        return new HttpEntity<byte[]>(document, header);
    }
}

然后您应该可以使用此HTML代码下载文件

<a href="/download/1">donwload file 1</a>
<a href="/download/2">donwload file 2</a>

希望这很清楚。

祝你好运!