无法上传Ppt并在IIS服务器中读取

时间:2015-10-14 07:15:19

标签: c# asp.net-mvc iis asp.net-mvc-5 powerpoint

我正在上传PPT文件,我正在将ppt silde转换成图像。当我在visual studio中运行时工作正常但是当我将代码发布到IIS服务器时我得到以下错误

  

使用CLSID检索组件的COM类工厂   {91493441-5A91-11CF-8700-00AA0060263B}由于以下原因而失败   错误:80070005访问被拒绝。 (HRESULT的例外情况:0x80070005   (E_ACCESSDENIED))。

代码:

<%= bootstrap_form_for Invitation.new do |f| %>
  <br>
    <ul>
      <%= f.hidden_field :attended_event_id, :value => @event_selected.id %>
      <% users.each do |user| %>
        <li>
          <%= check_box_tag 'invitation[attendee_id][]', user.id %>
          <%= h user.name %>
        </li>
      <% end %>
    </ul>
  <br>
  <%= f.submit "Invite Selected Users" %>
<% end %>


def create
@invitations = invite_params[:attendee_id].map do |attendee_id|
  Invitation.new(
    attended_event_id: invite_params[:attended_event_id],
    attendee_id: attendee_id
  )
end

if @invitations.any?(&:invalid?)
  flash.now[:error] = "Failure!"
  redirect_to root_path
else
  @invitations.each(&:save!)
  flash.now[:success] = "Invited!"
  redirect_to root_path
end
end

private
def invite_params
  params.require(:invitation).permit(:attended_event_id, {:attendee_id => []})
end

4 个答案:

答案 0 :(得分:3)

对于我在Windows Server 2012 R2(Azure)上的同一问题,网络上没有任何答案。这是缩小的解决方案,适用于所有服务器。

  1. 已安装Office并在每台服务器上激活产品
  2. 在C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop(64位操作系统)中创建了一个文件夹'Desktop' enter image description here
  3. 在IIS中,将ApplicationPool标识从“ApplicationPoolIdentity”更改为“LocalSystem”。 enter image description here
  4. 就是这样,我能够将幻灯片转换成图像。

    源代码

    如果您对我使用的代码感兴趣:

    Application pptApplication = new Application();
    Microsoft.Office.Interop.PowerPoint.Presentation pptPresentation = pptApplication.Presentations.Open2007(Server.MapPath("~/tempslides/pptfilename.pptx"), MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
    List<string> files = new List<string>();
    for (int i = 1; i <= pptPresentation.Slides.Count; i++)
    {
        pptPresentation.SaveCopyAs(serverPath + randomId, PpSaveAsFileType.ppSaveAsPNG, MsoTriState.msoTrue);
        files.Add(Server.MapPath("~/tempslides") + "/slide" + i + ".PNG");
    }
    pptPresentation.Close();
    

    要运行上面的代码,您需要在项目中添加对interop lib的引用。 enter image description here

    希望这可以帮助您节省时间。

答案 1 :(得分:2)

配置DCOM

  1. 转到开始 - &gt;运行

  2. 键入DCOMCNFG。 (这将加载“组件服务”)

  3. 转到组件服务 - &gt;计算机 - &gt;我的电脑 - &gt; DCOM配置 - &GT; Microsoft Office Power point

  4. 右键单击并选择“属性”。

  5. 选择“安全”标签。

  6. 启动和激活权限

    1. 选择自定义,然后按编辑按钮。
    2. 按添加按钮选择“网络服务”帐户。
    3. 授予本地启动和本地激活权限 单击确定按钮,然后测试您的应用程序,它现在应该可以正常工作。

答案 2 :(得分:0)

您应该授予“此用户”权限 然后在COM +设置中获取登录凭据。

答案 3 :(得分:0)

我已按照以下操作解决问题。

1)转到控制面板 - &gt;管理工具 - &gt;组件服务 - &gt;计算机 - &gt;我的电脑 - &gt; DCOM配置 - &gt; Microsoft Office Power point右键单击并选择“属性”。 选择“安全”选项卡。 并为启动和激活权限,访问权限和配置权限提供了对IIS_IUSR的完全访问权限。

2)将应用程序池标识设置为&#34; LocalSystem&#34;

3)为部署了Microsoft.Office.Interop Dll的文件夹提供对IIS_IUSR的完全访问权限

例如:C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Office \ PIA \ Office15的Visual Studio工具