GWT 上传/下载最佳实践

Posted

技术标签:

【中文标题】GWT 上传/下载最佳实践【英文标题】:GWT Upload/Download best practices 【发布时间】:2013-04-01 18:58:21 【问题描述】:

所以我是 GWT 的新手,我不确定对于我正在尝试做的事情来说最佳编程实践是什么。在我的 Web 应用程序中,用户将能够上传数据文件,我的应用程序需要能够访问该文件,对其执行一些操作,然后让用户下载处理后的文件。

到目前为止,我已经能够使用这个 doPost 方法成功上传带有上传 servlet 的文件:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

    try 
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
        fileUpload.setSizeMax(FILE_SIZE_LIMIT);

        List<FileItem> items = fileUpload.parseRequest(req);

        for (FileItem item : items) 
            if (item.isFormField()) 
                logger.log(Level.INFO, "Received form field:");
                logger.log(Level.INFO, "Name: " + item.getFieldName());
                logger.log(Level.INFO, "Value: " + item.getString());
             else 
                logger.log(Level.INFO, "Received file:");
                logger.log(Level.INFO, "Name: " + item.getName());
                logger.log(Level.INFO, "Size: " + item.getSize());
            

            if (!item.isFormField()) 
                if (item.getSize() > FILE_SIZE_LIMIT) 
                    resp.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, "File size exceeds limit");

                    return;
                
                String fileName = item.getName();
                if (fileName != null) 
                    fileName = FilenameUtils.getName(fileName);
                
                fileName = getServletContext().getRealPath("/uploadedFiles/" + fileName);

                byte[] data = item.get();
                FileOutputStream fileOutSt = new FileOutputStream(fileName);
                fileOutSt.write(data);
                fileOutSt.close();

                if (!item.isInMemory())
                    item.delete();
            
        
     catch (Exception e) 
        logger.log(Level.SEVERE, "Throwing servlet exception for unhandled exception", e);
        throw new ServletException(e);
    

当我查看我的 war 文件夹时,uploadFiles 文件夹已成功创建并将文件放在那里。

此时我有点卡住了,我一直在研究,但似乎无法找到一个清晰简洁的答案,说明什么是我在客户端访问上传文件以操纵它们然后允许的最佳方式用户下载它们。也许我正在接近这个错误,我不确定。如果有人能指出我正确的方向或向我展示一些做事的正确方法的好例子,那就太好了,谢谢。

【问题讨论】:

用户可以在下载前编辑文件?? @请问你要处理的文件是什么类型的? 【参考方案1】:

要在客户端访问文件,您需要一个新的 servlet 或与 doGet 方法一起使用的相同。

客户端应根据文件类型通过AnchorImage 请求文件,但添加参数以便服务器能够识别文件。通常您可以使用您用于上传的FileInput 的名称,或者您可以从服务器返回一个标签。

我建议你试试gwt-upload,它会为你节省很多时间。

【讨论】:

我已经使用 moxiegroup gwt 上传器 moxiegroup.com/moxieapps/gwt-uploader 进行上传,但是,现在文件已上传,我需要从中提取信息以在客户端使用。在客户端访问上传文件的最佳方法是什么 我没用过 moxiegroup 的库,但是用 gwt-upload 库上传器对象返回一个 url 来获取上传的文件uploader.fileUrl()【参考方案2】:

我解决了我的问题。文件上传成功后,我存储了文件名。后来我使用了一个RPC来访问服务器上的文件。我将文件名传递给 RPC,以便它知道我正在处理的文件,然后它在上传文件夹中查找该文件。所以我可以像这样创建java文件,

File file = new File((this.getServletContext().getRealPath("uploadedFiles") + File.separator + fileName));

并按照我认为合适的方式对其进行操作。

【讨论】:

以上是关于GWT 上传/下载最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

GWT 将大量数据从服务器发送到客户端的最佳实践

尽早避免 GWT 的 com.google.gwt.user.client.rpc.SerializationException 的最佳实践

从后台服务更新进度的最佳实践 [Android]

CakePHP 上传文件的最佳实践

活动存储:表单重新显示时保留/缓存上传文件的最佳实践

在PHP中获取上传文件扩展名的最佳方法/实践是啥[重复]