都是权限惹的祸!

   最近一直忙的做公司的项目,很少来这里发东西了,对不起大家了,随着,项目的结束,终于可以在这里吐槽了!


公司的项目其实说白了,就是想实现类似百度文库或其他文库类似的功能,供公司内部技术人员和销售人员来使用的,和文库类项目唯一不同的地方就是,就是多文档的同时上传。废话少说,直接上菜。

技术方面使用了如下的技术,PHP,uploadify,flashpaper,swftools,fleapaper,ADODB等技术。upuploadify的资料这里就不介绍了,简单的说一下,来自国外的一款优秀jQuery插件,主要功能是批量上传文件,它的使用说简单也简单,说复杂也复杂,我遇到的唯一的难点就是如何使用表单给后端传参数,这里,通过度娘查了很多的资料,但没有发现一个有用的,大多数的资料用的都是老的版本,所以,没什么参考价值,只有一个www.pooy.net/这个博客还有点参考价值。有很多关于这个插件的用法也是在这里了解到的,推荐小白们有时间去这里看看。

我实现的是批量上传,并同时入库的功能,数据库的接口选择了adodb,开发的时候出了洋相,居然,多文件上传成功但没有入库,后来,检查居然是路径的问题,害死人啊!其次,就是上传中文目录和中文文件名的错误,进行了多次的转换,核心技术其实就是iconv,搞得我有点晕,不时要检查中英文的情况,所以,还是希望php的以后的版本能早点实现unicode的功能。传递参数其实使用的是$_POST。

说完了批量上传,下面就要说道重点了,文档的转换,其实,也主要是实现以下文档的转换,word转pdf,pdf转swf,或其它文档转成上面提到的几个办法。通过搜索,发现大部分使用的是flashpaper这个,我一开始也是选择了这个,使用的方法也非常的简单,安装该软件,然后,默认为打印机,使用命令行参数对上传的文件进行相应的转换工作,那么,在PHP中,则使用系统执行函数执行相应的操作即可实现。

但问题偏偏出在php执行系统函数的上面了,其实,在php中执行系统函数非常简单,一个system,或exec就可以了,好了,开工,测试,没有出现相应的结果。难道是命令行语句有错吗?在cmd下运行,没有问题,说明不是软件的问题,难道,系统执行函数有错,用系统函数执行系统命令,见鬼了,居然有动静了。经过反复的测试,发现,只要是实现系统的命令,程序完美运行,只要一执行用户命令,程序没有反应。忘了,说了,我使用的apache+PHP的配置,IIS+PHP的环境,暂时对这个不感冒!总觉得配起来太麻烦。但不见得就不好啊,我只是犯懒了。

开始网上的搜索,大部分都是扯蛋的文章,没有发现一个有用的资料。没办法只能自己想办法,在这个项目开始以前,曾经在xampp环境下执行成功过一次,而由于xampp装上后占的硬盘太大,就换成了upupw了,该环境进行了的大量的优化组合,所以就果断的从xampp换成了upupw了,对了,其实是想用nginx组合的,但由于没有时间研究apache下的转换规则,就暂时放弃了,有时间再看看。废话少说,重新安装xampp,然后,在运行,居然。。。。。。。,活见鬼了,这2个环境没有大的区别啊,只是一个是系统服务运行,一个是单独运行。于是,把这个现象和upupw的作者做了反馈,他也表示不解,他对比了两个环境的配置文件,得出的结论是没有区别,于是,怀疑到是不是系统权限的问题啊,由于,执行系统命令,需要管理员权限并有完全控制功能,但我也查了。系统默认的就是管理员权限并有相应的规则。晕死,那就只能检查系统进程了,看看到底这2个系统后面发生了什么,打开任务管理器,看下面的截图:

居然发现,由于upupw使用的是系统服务运行的方式,它的用户名居然是system,而xampp没使用系统服务方式,它的用户名居然是administartor,不信这个邪,我把xampp也改成了系统服务方式,upupw由于无法更改选项,只能在系统服务栏中,把执行的用户名改成administator,活见鬼了,居然是xampp也不出结果了,upupw出结果。所以,最后的结论是原来是权限惹得祸。按理说不应该了,网上说的system的权限应该大于administartor的权限,有知道的人麻烦解释一下。

所以,当你想执行相应的系统级命令的时候,麻烦你检查下相应的权限。也许,就是因为这个权限会害你浪费了很多的时间和精力。大部分的人,由于不涉及到底层的应用,所以很容易的忽略这类问题。

功能是实现了,但效率也看出来了,由于flashpaper会发生其它比如死锁的现象,因此,有人建议不使用。由于,我们是在内部使用,因此不存在这个问题。为了解决上述问题,我也研究了fleapaper技术,但它使用的是把pdf转成swf,使用了seftool工具,这不是废话吗?要是上传了pdf,我才不用那个flashpriner呢?现在网上把pdf转成其它文件的我差不多都研究过。但没有发现有命令行接口的工具,如果有的话,会省很多时间的。有个7d-pdfmaker提供了命令行工具,它的图形界面势需要钱的,而命令行接口是免费的。但它对word文档要求比较严,我使用它转换word文档,居然,丢失目录格式。我也试过,其它的,什么com接口,调用wps等,使用python等等,但是不管使用那个方法,如果你的权限不对,什么都是白搭。

最后,还发现一个奇怪的现象,就是当你重新换系统后,即使,权限设置了,居然也不能实现相应的功能,你知道是为什么吗?


这个地方,你只要隐藏了已知文件类型的扩展名,就凭你是神仙也没辙。所以,这样的细节,还是要注意的好!

好了,收工!

展开阅读全文

都是空格惹的祸

04-04

[code=Java]rnpublic class PrintPyramid rn//利用嵌套循环打印数字三角形rn public static void main(String[] args) rn int numberOfLine = 20;//行数,此程序适用于100行以内,100行外不会竖列对齐rn for(int row = 1;row <= numberOfLine;row++)rn for(int column = 1;column <= numberOfLine - row;column++)rn System.out.print(" ");//三个空格rn rn for(int num = row;num >= 1;num--)rn System.out.print((num >= 10)?" " + num:" " + num);rn //第一个引号里一个空格,第二个引号里两个空格rn for(int num = 2;num <= row;num++)rn System.out.print((num >= 10)?" " + num:" " + num);rn //第一个引号里一个空格,第二个引号里两个空格rn System.out.println();rn rn rnrn[/code]rn结果为[code=Java]rn 1rn 2 1 2rn 3 2 1 2 3rn 4 3 2 1 2 3 4rn 5 4 3 2 1 2 3 4 5rn 6 5 4 3 2 1 2 3 4 5 6rn 7 6 5 4 3 2 1 2 3 4 5 6 7rn 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8rn 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9rn 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10rn 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11rn 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12rn 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13rn 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14rn 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15rn 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16rn 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17rn 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18rn 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19rn 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20rnrn[/code]rn这个程序只能打印出99行以内的数字,rn但大于等于100行后,数字就会呈不规则状态,原因是空格数不正确,rn大家讨论下当行数为三位数时,空格应该为多少,rn当行数为四位数时呢? 论坛

都是ATL.DLL惹的祸

01-11

用VC的ATL做COM组件,确实很爽(个人观点)。可有一个问题不知大家注意到了没:你做的COM组件在有的机子上注册不上,做了个COM嵌在网页中,用浏览器在有的机子上就是下载安装不上。问题就在ATL.DLL上,它本身也是个COM,如用户的机子上没有已注册的ATL.DLL,那方才说的问题就出现了。WIN 2000,WIN ME操作系统上已有此dll,可9X,NT 上确省可没有,装了VC,NETMEETING 3之类的会有,但不能指望用户机子上装了这些东东吧?特别是用于网页的ocx,你要提醒用户先在自己的机子上找找有没有ATL.DLL,如没有,则如何如何...?!那就做个INF文件,加上你的OCX与ATL.DLL打成一个CAB。哪网景浏览器呢?我在网景公司的网上得知‘Esker ActiveX Plug-in’可使网景浏览器支持ACTIVEX 控件,如今最新是4.1板,我们一直在用着,还算行吧。可它不支持CAB!rn气人:(。以前我用BCB做控件,没遇过ATL.DLL问题。因为有一次做的ASP组件在在9X,NT下均没问题,正好客户的SERVER用的是2000,结果在2000上没注册上。用VC做了一个是可以的,再加上其他一些原因吧,现在就用VC了,可没想到又遇上ATL.DLL问题,唉,怎么办?小弟技术,经验都差,不知为什么用BCB做的就不需要ATL.DLL,它的下面用的也是ATL呀!ATL.DLL有静态联编版本?我不知道,谁知道?先谢谢了。rn或则在网页上也将加上版本号,CLSID的ATL.DLL嵌进去,用户有就算了,无则下。是个办法,不过,谁有微软签过名的ATL.DLL?我可不能用自己的证书给它(ATL.DLL)签名,微软找我麻烦咋办?看来也不行。rnrn怎么办?rn1.找个支持CAB的网景浏览器插件?我没找到,谁有?rn2.静态联编ATL.DLL?谁有此库?rn3.有微软签名的控件来解决?谁有?rnrn我现在的方法是,让用户先下载个程序执行,将ATL.DLL拷在%system%下,然后regsvr32 ATL.DLL,可也太...不好了吧?rnrn如何解决?谢谢各位了先!!! 论坛

都是“信号和槽”惹的祸。。。

08-04

程序报错如下:rnwebview.o: In function `WebPage::createPlugin(QString const&, QUrl const&, QStringList const&, QStringList const&)':rnwebview.cpp:(.text+0xdd0): undefined reference to `QUiLoader::QUiLoader(QObject*)'rnwebview.cpp:(.text+0xde0): undefined reference to `QUiLoader::QUiLoader(QObject*)'rnwebview.cpp:(.text+0xe30): undefined reference to `QUiLoader::createWidget(QString const&, QWidget*, QString const&)'rnwebview.cpp:(.text+0xe44): undefined reference to `QUiLoader::createWidget(QString const&, QWidget*, QString const&)'rnwebview.cpp:(.text+0xe78): undefined reference to `QUiLoader::~QUiLoader()'rnwebview.cpp:(.text+0xf14): undefined reference to `QUiLoader::~QUiLoader()'rnwebview.cpp:(.text+0xe7c): undefined reference to `QUiLoader::~QUiLoader()'rnwebview.cpp:(.text+0xeb4): undefined reference to `QUiLoader::~QUiLoader()'rnwebview.cpp:(.text+0xeb8): undefined reference to `QUiLoader::~QUiLoader()'rnwebview.o:webview.cpp:(.text+0xee4): more undefined references to `QUiLoader::~QUiLoader()' followrncollect2: ld returned 1 exit statusrn错误信息说没用定义用到的函数,但是下面的头文件中定义如下:rn/*quiloader.h*/rn#ifndef QUILOADER_Hrn#define QUILOADER_Hrnrn#include rnrnQT_BEGIN_HEADERrnrnQT_BEGIN_NAMESPACErnrnclass QUiLoader : public QObjectrnrn Q_OBJECTrnpublic:rn QUiLoader(QObject *parent = 0);rn virtual ~QUiLoader();rnrn QStringList pluginPaths() const;rn void clearPluginPaths();rn void addPluginPath(const QString &path);rnrn QWidget *load(QIODevice *device, QWidget *parentWidget = 0);rn QStringList availableWidgets() const;rn QStringList availableLayouts() const;rnrn virtual QWidget *createWidget(const QString &className, QWidget *parent = 0, const QString &name = QString());rn virtual QLayout *createLayout(const QString &className, QObject *parent = 0, const QString &name = QString());rn virtual QActionGroup *createActionGroup(QObject *parent = 0, const QString &name = QString());rn virtual QAction *createAction(QObject *parent = 0, const QString &name = QString());rnrn void setWorkingDirectory(const QDir &dir);rn QDir workingDirectory() const;rn 。。。。。。。。rn;rnQT_END_NAMESPACErnrnQT_END_HEADERrnrn#endif // QUILOADER_Hrnrn在webview.cpp中,从这里开始使用头文件的定义:rn#if !defined(QT_NO_UITOOLS)rnQObject *WebPage::createPlugin(const QString &classId, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues)rnrn Q_UNUSED(url);rn Q_UNUSED(paramNames);rn Q_UNUSED(paramValues);rn QUiLoader loader;rn return loader.createWidget(classId, view());rnrn#endif // !defined(QT_NO_UITOOLS)rnrn希望高手给点意见,指点指点,现在代码改的我都不知道什么错误原因了,谢谢了,小弟现在一片迷茫了。 论坛

都是“全局变量惹的祸”

03-24

1、我现在在stdafx.cpp中定义了如下全局变量rnCAdoConnection adoConn; // CAdoConnection 是我自己创建的一个对_ConnectionPtr 的封装类;rnCAdoRecordset adoRec; // CAdoRecordset 是我自己创建的一个对_RecordsetPtr 的封装类;rnrn2、在stdafx.h中使用了如下引用rnextern CAdoConnection adoConn;rnextern CAdoRecordset adoRec;rnrn3、在程序中没有对这两个全局变量进行引用rn 但是在程序退出的时候就会有报错对话框出现(Unhandled exception in test.exe:0xC0000005: Access Violation),我对错误进行了跟踪,错误指向了COMIP.H文件中的“m_pInterface->Release();”rnrn void _Release() throw()rn rn if (m_pInterface != NULL) rn m_pInterface->Release();rn rn rnrn但是,如果我不采用全局变量的时候,程序都能正常执行和退出。rnrn请问各位,是不是我的全局变量的定义有问题,还是哪个地方出现了错误?rn我的 构造函数 和 构析函数如下:rnrnCAdoConnection::CAdoConnection()rnrn AfxOleInit();rn m_pConnection.CreateInstance("ADODB.Connection");rnrn#ifdef _DEBUGrn if(m_pConnection==NULL)rn rn AfxMessageBox("Connection 对象创建失败! 请确认初始化了COM环境!\r\n");rn rn#endifrnrn ASSERT (m_pConnection!=NULL);rnrnrnCAdoConnection::~CAdoConnection()rnrnrnrnCAdoRecordset::CAdoRecordset()rnrn m_pConnection = NULL;rnrn m_pRecordset.CreateInstance("ADODB.Recordset");rn#ifdef _DEBUGrn if (m_pRecordset == NULL)rn rn AfxMessageBox("RecordSet 对象创建失败! 请确认是否初始化了COM环境.");rn rn#endifrn ASSERT(m_pRecordset != NULL);rnrnrnCAdoRecordset::~CAdoRecordset()rnrnrn 论坛

没有更多推荐了,返回首页