【问题标题】:How to grab a local path from end-user in JSF如何在 JSF 中从最终用户那里获取本地路径
【发布时间】:2011-11-05 15:39:57
【问题描述】:

我面临一个简单的问题 我想从我的 Web 应用程序的最终用户那里获得一个本地路径。我只需要那个而不是实际上传文件。 (我知道 seam 或 Primefaces 中有 fileUpload 标签,但我只需要本地完整路径,因为我通过 Google API 直接上传到 Picasa 网络相册)

换句话说,我想绑定某种 html 标签:input type="file" 到 bean 属性(我注意到 JSF 标记 h:inputText 标记没有 type 属性) 有什么想法吗?

环境:JBoss AS 5.1、JSF1.2、Seam 2.2、Primefaces 1.1

编辑:这是我的工作解决方案

感谢答案,我实现了将文件直接上传到 Picasa 的用例

    <h:form prependId="false" enctype="multipart/form-data">
        <s:fileUpload id="fileUpload"
                data="#{picasa.incomingFile}"
                contentType="#{picasa.fileType}"/>
        <h:inputText id="albumId"
                value="#{picasa.albumId}" />
        <h:commandLink action="#{picasa.upload()}"
                value="Upload">
            <f:param name="s"
                    value="#{subjectHome.id}"/>
        </h:commandLink>
    </h:form>

以及组件代码

@Name("picasa")
public class PicasaService {

    @Logger private Log log;

    private PicasawebService service;
    private InputStream incomingFile;
    private String fileType;
    private String albumId;



    @Create
    public void setUp()
    {
        service = new PicasawebService("picasaService");
        try {
            service.setUserCredentials("xxx@yyyy.zzz", "password");
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }
    }

    public void upload()
    {
        URL albumUrl;
        PhotoEntry returnedPhoto;
        try {
            albumUrl = new URL("https://picasaweb.google.com/data/feed/api/user/default/albumid/" + albumId);
            MediaStreamSource myMedia = new MediaStreamSource(incomingFile , this.fileType);
            returnedPhoto = service.insert(albumUrl, PhotoEntry.class, myMedia);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ServiceException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这样,在我看来,文件不会被传输两次(一次从最终用户机器传输到我的网络应用程序的服务器,然后从那里传输到 picasa WA 服务器)。

希望对你有帮助

【问题讨论】:

    标签: jsf web-applications jsf-1.2 picasa


    【解决方案1】:

    但我只需要本地完整路径,因为我通过 Google API 直接上传到 Picasa 网络相册

    您需要从JSF文件上传组件中获取文件内容为InputStream,并以通常的方式将其写入服务器本地磁盘文件系统上的FileOutputStream,然后您可以将其引用为Filepass it to the Picasa API as documented

    另见:

    【讨论】:

    • 谢谢!似乎是我问题的最佳答案。我想在我的场景中没有办法不传输文件两次。
    • 您不能通过纯 HTML 将数据直接从客户端 X 传输到客户端 Y。您必须自己为调解员效力。无论如何,客户端在使用&lt;input type="file"&gt;时已经已经发送了文件的内容,那你为什么要忽略它呢?
    【解决方案2】:

    出于安全原因,您无法获取本地路径,所有现代浏览器都不会为您的代码提供该信息...最好的情况是它们只给您文件名...

    【讨论】:

    • 感谢您的回答。也许我不明白:例如 html 标签 实际上提供了一个本地路径。我只需要将该值绑定到 JSF bean。
    • 即使不完全一样,这个问题也和stackoverflow.com/q/7942611/585104有关
    • @Koyaga:您阅读并理解答案了吗?没有办法。时期。一些较差的浏览器会沿文件名传递完整路径,但这样做是浏览器的错误。
    • @koyaga 否 - 仅当安全性非常宽松和/或与非常旧的浏览器和/或 Flash/Silverlight 一起使用时才有效...在纯客户端 HTML/JS 中这是不可能的- 例如,请参阅 developer.mozilla.org/en/Using_files_from_web_applications... 对于您的场景的 JSF 处理,请参阅 BalusC 的答案
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多