我有一个网站,提示用户从外部资源下载文件.由于外部文件名被散列并且用户下载了多个文件,因此用户很难知道他们下载的文件到达了他们请求的资源.例如,文件名fdae442dafe42.zip可以是production-resources.zip.
我正在寻找方法,以便浏览器将文件作为一个不同的名称下载.以下是我的一些想法以及为什么它们不起作用,但您可以找到解决方法.
请注意,我对外部资源没有任何控制权.我将无法更改标题或其他任何内容.我的服务是一个主要针对桌面用户的网站.Android和iOS解决方案不会那么有用.
下载属性
这种方法在谷歌Chrome和Firefox中运行了一段时间,但随后他们开始遵循W3 HTML5规范.外部资源需要发送Content-Disposition之前谷歌浏览器和Firefox未检查过的标题.
PHP代理下载
我知道我可以让PHP脚本向外部资源发出请求,然后在更改标题和名称以满足我的需求时将其提供给最终用户.问题是网站流量很大,每个用户下载大约1-2GB的数据.我的服务器无法处理这种类型的流量,升级服务器的成本可能太高.
使用外部应用程序重命名文件
我正在考虑使用外部应用程序(可能是Chrome/Firefox扩展程序),它们会在完成下载后重命名这些文件.但考虑到我的观众数量足够大,一次访问者,要求他们下载应用程序或扩展程序是不太可能的.
Flash或Java嵌入式解决方案
我正在考虑使用Java或Flash嵌入式文件来处理文件下载,但我对这两个平台都不太了解.据我所知,Flash对用户的文件系统没有太多控制权,因此这可能是一个问题.Java将能够完成这项任务,但我真的希望我不必使用Java,因为它通常不安全,需要大量下载才能安装它(与外部软件的想法相同).
如果您对我可能采取的措施有什么想法来解决这个问题,我们将不胜感激.我不是在寻找任何代码,只是关于如何完成上述任务的想法.我想感谢你们所有的时间和专业知识.
我无法使用GCC(MinGW)将Comctl32.lib链接到我的程序.
GCC输入:
gcc -o program.exe main.c images.o -lgdi32 -lcomctl32 -mwindows
Run Code Online (Sandbox Code Playgroud)
GCC输出
main.c: In function 'WinMain':
main.c:120:2: error: unknown type name 'INITCOMMONCONTROLSEX'
main.c:124:9: error: request for member 'dwICC' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)
main.c中的相关代码
#define _WIN32_WINNT _WIN32_WINNT_WIN7
#include <windows.h>
#include <commctrl.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmd)
{
Line 120: INITCOMMONCONTROLSEX icex;
Line 124: icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex);
}
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助或信息.我已经这么久了,只是无法得出答案.
我刚刚开始使用C,并且从来没有处理过我以前用过的语言中的指针,所以我想知道如果只是修改一个字符串,哪种方法更好.
指针串与正常.
此外,如果您想提供有关何时使用指针的更多信息,那将是很棒的.当我发现函数"normal"甚至会修改传递的字符串,并在main函数中更新而没有返回值时,我感到很震惊.
#include <stdio.h>
void pointerstring(char *s);
void normal(char s[]);
int main() {
char string[20];
pointerstring(string);
printf("\nPointer: %s\n",string);
normal(string);
printf("Normal: %s\n",string);
}
void pointerstring(char *s) {
sprintf(s,"Hello");
}
void normal(char s[]) {
sprintf(s,"World");
}
Run Code Online (Sandbox Code Playgroud)
输出:
Pointer: Hello
Normal: World
Run Code Online (Sandbox Code Playgroud)