【问题标题】:Angular Static File DownloadAngular 静态文件下载
【发布时间】:2015-11-02 16:02:28
【问题描述】:

我正在尝试使用 Angular 创建文件下载或查看按钮。每个用户的文件都是相同的,我希望通过将静态文件放在前端来避免调用后端。

大多数解决方案都需要使用与浏览器不太兼容的“下载”属性 (CanIUse),或者它们从服务器获取生成的文件。我只是想让用户打开或下载静态 pdf 文件。

我尝试了这样的链接:

<a href="/attachment.pdf" target="_self" >Attachment</a>

但这会寻找我显然没有的后端链接。我只想提供静态文件,而不是创建后端路由。

这可能吗?我有一个 Angular 前端和 Django 后端。

【问题讨论】:

  • placing the static file in the frontend 是什么意思?来源是什么?看看jspdf.js
  • 我的意思是我希望将 pdf 文件存储在前端文件中,以及我所有的模板、控制器等。这样,我就不必访问后端来获取它。
  • 但是您的文件必须存储在您的服务器中,即后端,然后由客户端下载。我在这里没有得到什么?
  • 我想我对前端无法访问自己的当前工作目录、导航到文件等这一事实感到困惑。这种操作必须在服务器上完成
  • 如果它是一个实际的 pdf 文件概念是没有任何意义的。它必须以某种方式来自服务器,并且根本不清楚您要规避什么

标签: javascript angularjs django html


【解决方案1】:

如果您尝试将 pdf 文件与 angular 应用程序的 javascript 代码连接起来,我认为这是不可能的(或者至少我不知道该怎么做,也不认为会是个好主意/值得)。

您可以将您的 pdf 文件作为任何其他静态文件提供,以便您通过让用户访问文件的 url 来访问它,例如:

<a href="/static/files/myfile.pdf" target="_self" >Attachment</a>

然而,这将使浏览器决定如何访问 pdf 文件。例如,Chrome 默认会打开一个“预览页面”。

如果您想强制将文件下载到用户的设备而不是允许预览,您需要通过在响应中设置 Content-Disposition 标头来使您的后端这样做。

Content-Disposition: attachment; filename="myfile.pdf"

【讨论】:

  • Angular 是否需要对响应进行任何特殊处理才能使下载正常工作?
  • Angular 不需要做任何事情,那是浏览器的责任
【解决方案2】:

从我的问题中的 cmets 可以看出,无法从前端获取 PDF。我最终制作了一条用于获取 PDF 的后端路线,然后在新选项卡中打开它。这是我使用的代码。

从服务器获取文件的可点击链接:

<a ng-click="viewFile()" href="">Attachment</a>

命中后端路由的函数:

$scope.viewFile = function() {
  var downloadFileURL = $rootScope.urlFormatter2('file');
  $http.get(downloadFileURL, {responseType:'arraybuffer'})
    .success(function(data, status, headers, config) {
      var file = new Blob([data], {type: 'application/pdf'});
      var fileURL = URL.createObjectURL(file);
      window.open(fileURL);
    })
    .error(function(error) {
      console.error(error);
    });
};

后端路由(在 Django 中):

def ctm_file(request):
    filename = "ctm_form.pdf" # Select your file here.
    wrapper = FileWrapper(file(filename))
    response = HttpResponse(wrapper, content_type='text/plain')
    response['Content-Length'] = os.path.getsize(filename)
    return response

感谢大家帮助更好地了解使用客户端服务器应用程序获取文件的性质。

【讨论】:

  • 有什么意义?为什么不直接打开没有所有不必要代码的 url?使用开发工具网络仍然可以检测到路径,因此您不会掩盖任何东西
  • 我不想掩盖任何东西,我只是想要一种非常简单的方法来提供 pdf 文件并显示它。我看不出如何以更简单的方式从服务器提供文件,或者在不创建 blob 的情况下将其显示在前端。
  • window.open('/attachment.pdf')
  • 当我输入这样的路由时,Django 假设我正在尝试使用预定义的后端路由。解决该问题的方法是实际创建后端路由并提供 pdf。它不允许我随意获取这样的文件。
  • 不管怎样都行。我假设是问题中提到的静态资产文件
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 2015-10-10
  • 2021-11-16
  • 2013-04-26
  • 1970-01-01
  • 2021-05-28
  • 2017-09-14
  • 2019-05-16
相关资源
最近更新 更多