+ Start a Discussion
t.ishibuchit.ishibuchi 

カスタマーポータルサイトとForce.comサイトから 添付ファイル(Attachment)を参照したい

お世話になっております。

カスタマーポータルサイトとForce.comサイトから
添付ファイル(Attachment)を参照したいと考えております。

いままでは、

-----Apexクラス-------------------------
public String getFileURL() {
    //添付ファイルのID
    String file_id = [SELECT Id FROM Attachment WHERE ParentId = 添付ファイルのあるレコードのID].Id
    //ベースURL
    String baseURL = URL.getSalesforceBaseUrl().toExternalForm();
    //添付ファイルのURL
    String file_URL = baseURL + '/servlet/servlet.FileDownload?file=' + file_id;
    return file_URL;
}
----------------------------------------

-----Visualforceページ-------------------
<apex:form >
        <apex:image url="{!FileURL}" />
</apex:form>
-----------------------------------------

の様に実装し、
管理者設定→セキュリティのコントロール→共有設定→組織の共有設定で、
添付ファイルのあるオブジェクトを「公開/参照」にすると添付ファイルが表示されていたのですが、
「非公開」にすると表示されなくなってしましました。

オブジェクトの共有設定を「非公開」にした状態で、
オブジェクトのレコードの内容をApexからVisualforceに表示させることは出来ているのですが、
オブジェクトの共有設定を「非公開」にした状態で、
オブジェクトの添付ファイルを表示させるにはどのようにすれば良いのでしょうか。

他の方法でも、カスタマーポータルサイトとForce.comサイトで添付ファイルを表示する方法を
ご存知でしたらご教授頂きたいです。

どうぞ宜しくお願い致します。

 

 

Best Answer chosen by Admin (Salesforce Developers) 
t.ishibuchit.ishibuchi

遅くなってしまいましたが、解決しましたのでご報告させて頂きます。

 

管理者設定→セキュリティのコントロール→共有設定→組織の共有設定で「非公開」にしたまま、

 

ポータルユーザ用のプロファイル→カスタムオブジェクト権限→添付ファイルを添付しているオブジェクトの権限→

データ管理→全て表示チェックボックスにチェックを入れることで

添付ファイルをVisualforceで表示することができました。

 

権限設定について、勉強不足でした・・・。

そして、上手く設定環境の報告が出来ていなかったかもしれません。

 

何度も丁寧にご回答して頂いた

All Answers

Taiki YoshikawaTaiki Yoshikawa

あまりいい方法ではないかもしれませんが、without sharingで対応するのはどうでしょうか。

without sharingだと権限のないユーザでも検索して表示できると思います。

 

ただ気をつけないと本来見えてはいけない情報にもアクセスできてしまうのでその辺りの注意が必要だと思います。

 

 

without sharingに宣言の仕方については次のリンク先が参考になると思います。

 

Using the with sharing or without sharing Keywords

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_keywords_sharing.htm

t.ishibuchit.ishibuchi

さん

 

ご回答、ありがとうございました。

 

without sharingを使ってみましたが、表示されませんでした。

 

添付ファイルを表示するとき、

「ベースURL(http://~force.com)+ /servlet/servlet.FileDownload?file= + ファイルID」

で表示できるので、

Apex側でファイルのIDを取得し、それをVisualforceの方で以下のように画像として表示させるように実装しています。

<apex:image url="{!Apex側で取得したファイルIDを含むURL}" />

 

そもそもこの方法がベストなのか分からないのですが、

Apex側でファイルIDを取得はできているが、Visualforceで直接URLを指定しても表示できないようです。

 

他に添付ファイルをVisualforceで表示する良い方法はあるでしょうか?

ご存知でしたら教えて頂きたいです。

 

宜しくお願い致します。

Taiki YoshikawaTaiki Yoshikawa

記載頂いたコードを参考にDev環境のカスタマーポータルの方で試してみました。

 

一応このようなコードで添付ファイル内の画像が表示されることを確認できたのですがどうでしょうか。

※取引先に紐付く添付ファイルという形で検証しています。

 

Page

<apex:page standardController="Account" extensions="LookAttachmentController" showHeader="true" sidebar="false">
    <apex:form >
        <apex:pageBlock >
            <apex:outputText value="{!baseUrl}" /> 
            <apex:pageBlockTable value="{!attachments}" var="item">
                <apex:column headerValue="{!$ObjectType.Attachment.Fields.Name.Label}">
                    <apex:outputField value="{!item.Name}" />
                </apex:column>
                <apex:column headerValue="{!$ObjectType.Attachment.Fields.Body.Label}">
                    <apex:image url="{!baseUrl}/servlet/servlet.FileDownload?file={!item.Id}" style="width:80px;" />
                </apex:column>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

 Class

public without sharing class LookAttachmentController {
    
    public List<Attachment> attachments {get; set;}
    public String baseUrl {get; set;}
    
    public LookAttachmentController(ApexPages.StandardController stdController) {
        this.attachments = [SELECT Id,Name FROM Attachment WHERE ParentId =: stdController.getId() LIMIT 200];
        this.baseURL = URL.getSalesforceBaseUrl().toExternalForm();
    }
}

 

これでwithout sharingの場合は添付ファイル名と画像が表示され、with sharingの場合は非表示になることが確認できました。

もしかしたらサイトでは動かない可能性もありますが、ひとまずカスタマーポータルの方はこれで動作確認できると思います。

Taiki YoshikawaTaiki Yoshikawa

Force.comサイトの方でも確認できました。

ひとまず先程の方法で表示されることを確認できると思います。

 

検証時には取引先の共有設定が非公開でオブジェクトの参照権限が無しの状態で確認しています。

これで表示できたので他に設定に違いがなければ同じ結果が得られると思います。

t.ishibuchit.ishibuchi

Taikiさん

ご回答頂き、ありがとうございます。

教えて頂いた方法で実装してみたのですが、カスタマーポータルサイトで表示されませんでした。
(システム管理者では、表示を確認できました。)

他の設定を再度確認したのですが、
ポータルサイトにログインするユーザの(プロファイルの)ユーザライセンスが、
「Overage Authenticated Website」であることが関係しているのかもしれないと思いました。

Overage Authenticated Websiteについて調べてみたのですが、
関係ありそうな情報を見つけることができませんでした。
ユーザライセンスが関係していることは考えられるでしょうか?
 
何度も申し訳ありませんが、ご存知のことがありましたらご教授頂きたいです。
宜しくお願い致します。

Taiki YoshikawaTaiki Yoshikawa
ライセンスの方は気にしてませんでした。

ちょっとすぐには確認できないのですが、何か影響があるのかもしれません。

こちらで検証した時はポータルユーザ有効化時にデフォルトでセットされていたプロファイルとライセンスを使用して検証しました。
サイトの方はログイン前のGestプロファイルで確認しています。

もしかすると自分の検証方法が間違ってたかもしれないです。。
Taiki YoshikawaTaiki Yoshikawa
もしかしたらと気になったのですが、そのプロファイルがアクセスできるVisualforceの権限の方は設定されてますでしょうか。
公開の時には参照できるとのことなので設定済みだとは思ったのですが、思い当たるのがその辺ぐらいでした。
t.ishibuchit.ishibuchi

>そのプロファイルがアクセスできるVisualforceの権限

上記は、

プロファイルの「有効な Visualforce ページ」で表示したいVisualforce ページを追加するところですよね?

そちらでしたら設定しており、ページ自体は表示されるのですが、画像(添付ファイル)が表示されない状態です。

 

教えて頂いた実装方法で添付ファイルが表示されないのは、

ライセンスの問題か、権限の設定の問題ですよね。。

やはり添付ファイルのオブジェクトを「公開/参照」にするしか方法はないのでしょうか・・・。

Taiki YoshikawaTaiki Yoshikawa

他のユーザにアクセスされると困る場合は「公開/参照」にせずに「非公開」にしておいた方が良いと思います。

特にカスタマーポータルやForce.comサイトでは社外のユーザが使用することになると思いますので

間違ってアクセスできてしまう危険があるのは良くないと思います。

 

Overage Authenticated Website ライセンスの話で気になるサイトがありました。

 

ユーザライセンスの種類

https://na9.salesforce.com/help/doc/ja/users_understanding_license_types.htm

 

このサイトでOverage Authenticated Website ライセンスで検索するとPlatform ポータルユーザライセンスのところに記載がありました。

このライセンスですが、カスタムオブジェクトを扱う権限自体が無いみたいです。

添付ファイルの親オブジェクトがカスタムオブジェクトでしたらこれが理由で表示されないのかもしれないです。

 

 

ちなみにですが今回使用するのは添付ファイルでないとダメな感じでしょうか。

親オブジェクトのアクセス権が無いということなので特定の親に紐付く添付ファイルを表示という形式ではないのかなと思いました。

 

ドキュメントオブジェクトや静的リソースに画像をアップロードして表示するといった方法もできると思います。

Overage Authenticated Website ライセンスでもドキュメントオブジェクトなら扱えるみたいです。

t.ishibuchit.ishibuchi

認識であったので、

Taiki YoshikawaTaiki Yoshikawa

権限の問題難しいですね。。

 

ドキュメントの権限設定ですが、ドキュメントフォルダで管理するというのはどうでしょうか。

ロールか公開グループを対象にアクセス権を指定できると思うので、ある程度の調整はできそうかなと思いました。

 

ただちょっと管理が大変かもしれないです。

t.ishibuchit.ishibuchi

遅くなってしまいましたが、解決しましたのでご報告させて頂きます。

 

管理者設定→セキュリティのコントロール→共有設定→組織の共有設定で「非公開」にしたまま、

 

ポータルユーザ用のプロファイル→カスタムオブジェクト権限→添付ファイルを添付しているオブジェクトの権限→

データ管理→全て表示チェックボックスにチェックを入れることで

添付ファイルをVisualforceで表示することができました。

 

権限設定について、勉強不足でした・・・。

そして、上手く設定環境の報告が出来ていなかったかもしれません。

 

何度も丁寧にご回答して頂いた

This was selected as the best answer
Taiki YoshikawaTaiki Yoshikawa

データ管理の全て表示で対応できたんですね。

勉強になりました。