我正在开发一个Web应用程序.用户可以使用HTTP协议上传文件.经典的HTML文件上传控件和用于上传文件的Java小程序之间有一个选择.
经典的HTML文件上传不是很好,因为你一次只能选择一个文件,而且在实际上传过程中很难获得任何进度指示(我最终使用定时器刷新了一个进度指示器,其中包含从中获取的数据)服务器通过AJAX调用).优点:它始终有效.
使用Java applet,我可以做更多的事情:一次选择多个文件(甚至是文件夹),压缩文件,获得真正的进度条,在applet上拖放文件等等......
但是有一些缺点:
UrlConnection使用HTTPS 的Java 类中存在错误,因此我使用Apache通用HTTP客户端来执行实际的HTTP上载.这是一个非常大的包,减慢了.jar文件的下载速度 我一直在维护这个Java applet但是现在我已经厌倦了所有的缺点,并考虑编写/购买一个全新的组件来上传这些文件.
题
如果您有以下要求:
你会使用什么技术/组件?
编辑:
我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望从这些函数中得到结果.这适用于以下配置:
但它不适用于MAC OS上的Firefox
问题的根源似乎是始终返回null的win.eval调用.我在Mac OS X 10.4.11上使用Firefox 3.0.6进行了测试
一点代码:
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("testfunc()");
System.out.println("exp = " + exp.toString());
Run Code Online (Sandbox Code Playgroud)
这会触发java.lang.NullPointerException(exp.toString())语句.testfunc javascript函数只返回true.
我尝试使用win.call并得到了相同的结果.
我的applet标记包含mayscript和scriptable属性.
我找到答案感谢特里斯坦.测试他的解决方案我创建了一个非常简单的测试,可以工作并以我的方式找到罪魁祸首.我确信我用一个空的testfunc()做了我的测试,它刚刚返回true,但我可能没有,因为在那种情况下它会起作用.这里真正的问题是该函数称为applet的公共方法.Liveconnect似乎无法在Firefox Mac中处理这种情况.
让我给你举个例子 :
Java类:
public class MyApplet extends Applet {
public int getMyValue() {
return 5;
}
public void somefunction() {
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("jsfunc()");
System.out.println("exp = " + exp.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
和javascript代码:
function jsfunc() {
var myApplet = document.getElementById("applet_id");
return myApplet.getMyValue() + …Run Code Online (Sandbox Code Playgroud) 一些解释:对于我正在研究的项目,我必须编写一个在后台运行的程序,检测文件的更改,并将修改后的文件上传到Web服务,以便其他人可以使用.如果不是用户修改大文件并决定在编辑后立即关闭其计算机,则非常简单的同步.
我可以取消上传并等待下次重启以进行上传,但我可以想象用户第二天早上将文件从网络下载到另一台计算机,并且不明白为什么他昨晚的更改不存在.
所以我的想法是检测用户何时注销或重新启动Windows,如果我正在上传,只要询问用户"我们仍在同步Foo.txt您刚刚更改的文件.您确定要重新启动吗? ?在重新启动计算机之前,您的更改将无法用于其他人!" 如果用户拒绝,我需要取消重启/注销
这可能吗?
当另一个应用程序将文件发送到我的应用程序时,我通过该intent.getExtras().get(EXTRA_STREAM)属性获得了一个Uri .然后我可以使用输入流获取文件的字节:new BufferedInputStream(activity.getContentResolver().openInputStream(uri));
一切都很好,到目前为止工作.现在我想向我的用户展示一些进展,但是我不确定如何在不事先读取流的情况下获得文件的总字节数(这会破坏进度条的整个目的) )...
我试过ParcelFileDescriptor fileDesc = activity.getContentResolver().openFileDescriptor(uri, "r");但这只适用于类型的uris file://....
例如,如果我从Skydrive收到一个文件,我会得到一个content://..Uri,如:content://com.microsoft.skydrive.content.external/external_property/10C32CC94ECB90C4!155/Sunset.480p.mp4
在这样的Uri上,我(不出所料)得到了"FileNotFoundException:Not a whole file"异常.
任何确定的火灾方式来获得我将获得的数据流的总大小?
我想转发带有假装客户端RequestInterceptor的请求标头,但是,在内RequestInterceptor.apply, RequestContextHolder.getRequestAttributes()是null,所以SecurityContextHolder.getContext().getAuthentication()(我最终也可以得到我的标头的值).
这曾经在升级到Spring-Cloud Brixton之前工作,其中hystrix命令现在必须可以在单独的线程中运行,因为更改为以下参数可以解决问题:
hystrix.command.default.execution.isolation.strategy: SEMAPHORE
Run Code Online (Sandbox Code Playgroud)
现在,如果没有必要,我不太热衷于更改这种默认值,是否有另一种推荐的转发标头现在的方式?
谢谢
TLDR:我在RxJava Observables中进行后台处理,我正在进行集成测试,我希望能够独立等待该处理完成,以确保从一次测试开始的后台处理不会干扰另一个测试.
简化,我有一个@RequestMapping方法,可以执行以下操作:
HttpStatus.NO_CONTENT)这种异步处理以前是用a完成的ThreadPoolTaskExecutor.我们将转换到RxJava并希望删除此ThreadPoolTaskExecutor并使用RxJava进行后台处理.
所以我试图这样做的时候非常天真:
Observable
.defer(() -> Observable.just(call to long blocking method)
.subscribeOn(Schedulers.io())
.subscribe();
Run Code Online (Sandbox Code Playgroud)
最终目标当然是,一步一步,进入"调用长阻塞方法"并一直使用Observable.
在此之前,我想首先使我的集成测试工作.我通过对映射执行RestTemplate调试来测试它.由于大多数工作是异步的,我的调用返回非常快.现在我想找到一种方法来等待异步处理完成(以确保它不与另一个测试冲突).
在RxJava之前,我只计算ThreadPoolTaskExecutor中的任务并等到它达到0.
我怎么能用RxJava做到这一点?
我尝试了什么:
我可能非常错误,或者过于复杂的事情,所以不要犹豫,纠正我的理由!
我正在研究的Wix设置询问用户是否从桌面上的主程序安装shorcut.
问题是在升级过程中,删除了快捷方式,然后重新创建:
有没有一种简单的方法来妥善处理这种情况?
以下是我的wix设置的信息:
每台机器安装
用户选择通过在"选择目标"的修改版本上添加的复选框来安装桌面快捷方式:
<Control Id="DesktopShortcutCheckBox" Type="CheckBox" X="20" Y="160" Width="290" Height="17" Property="INSTALLDESKTOPSHORTCUT" CheckBoxValue="[INSTALLDESKTOPSHORTCUT]" Text="!(loc.InstallDirDlgCreateDesktopShortcut)" />
Run Code Online (Sandbox Code Playgroud)
在UI标记中,我初始化了属性:
<Property Id="INSTALLDESKTOPSHORTCUT" Value="1"/>
Run Code Online (Sandbox Code Playgroud)
这是使用INSTALLDESKTOPSHORTCUT条件创建快捷方式的组件:
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="desktopconnecteurdts" Guid="a-real-guid-here">
<Condition>INSTALLDESKTOPSHORTCUT=1</Condition>
<Shortcut Id="desktopconnecteurdts" Name="DTS eXplorer" WorkingDirectory="ApplicationFolder" Icon="DTSeXplorer.exe" Target="[ApplicationFolder]\DTSeXplorer.exe" Advertise="no" />
</Component>
</Directory>
Run Code Online (Sandbox Code Playgroud)
启动后,安装程序将检查是否存在旧版本,如果找到则删除旧版本:
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion OnlyDetect="no"
Property="PREVIOUSVERSIONSINSTALLED"
Minimum="$(var.OldProductVersion)"
IncludeMinimum="yes"
Maximum="$(var.ProductVersion)"
IncludeMaximum="no"
RemoveFeatures="all" />
<UpgradeVersion OnlyDetect="yes" Property="PROJECT_DOWNGRADE"
Minimum="$(var.ProductVersion)" IncludeMinimum="no" />
</Upgrade>
Run Code Online (Sandbox Code Playgroud)
产品版本major不会改变,例如我从1.6.8.12345升级到1.7.2.56789
谢谢 !
使用 Xamarin.Android,我尝试使用 Mono.Data.Sqlite 包(使用 Nexus 7)使用 sqlite 数据库。
一切都很好,直到我尝试使用多个线程,然后我得到了一个损坏的数据库或锁定数据库的各种异常(这意味着我必须停止并重新启动应用程序才能再次访问数据库)。
Mono.Data.Sqlite.SqliteConnection.SetConfig (Mono.Data.Sqlite.SQLiteConfig.Serialized);
Run Code Online (Sandbox Code Playgroud)
但是我在该行上收到一个 Mono.Data.Sqlite.SqliteException ,说明:
Library used incorrectly
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 3 个可能的枚举值(SingleThreaded、Serialized、MultiThreaded),结果相同。
这种方法真的有效吗?
编辑:我修复了我的源问题(那些讨厌的无限循环,我永远不会摆脱它......),所以不需要再为我玩线程配置了。
不过,我会将这个问题留给其他人,因为问题仍然存在,并且已被其他人试验过(参见对此答案的评论)
我有一个 Spring 服务可以执行类似的操作:
@Service
public class MyService {
@Transactional(propagation = Propagation.NEVER)
public void doStuff(UUID id) {
// call an external service, via http for example, can be long
// update the database, with a transactionTemplate for example
}
}
Run Code Online (Sandbox Code Playgroud)
Propagation.NEVER 指示调用该方法时我们不能有活动事务,因为我们不想在等待外部服务的答复时阻止与数据库的连接。
现在,我如何正确测试它然后回滚数据库?@Transactional 在测试中不起作用,因为 Propagation.NEVER 会出现异常。
@SpringBootTest
@Transactional
public class MyServiceTest {
@Autowired
private MyService myService;
public void testDoStuff() {
putMyTestDataInDb();
myService.doStuff(); // <- fails no transaction should be active
assertThat(myData).isTheWayIExpectedItToBe();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以删除@Transactional,但是我的数据库对于下一个测试来说并没有处于一致的状态。
目前,我的解决方案是在 @AfterEach junit 回调中的每次测试后截断数据库的所有表,但这有点笨拙,并且当数据库有多个表时会变得相当慢。
我的问题是:如何在不截断/使用 @Transactional 的情况下回滚对数据库所做的更改? …
我有一个即将到来的项目,我需要处理来自浏览器的非常大的上传(经典输入类型="文件"或Java小程序),并寻找在服务器上完成工作的最佳工具.
论文是我需要的东西:
我仍然对使用什么技术有一定的自由度,所以我想提出一些建议,以便能够选择服务器上的最佳技术来处理这项任务:
我更习惯微软堆栈,但愿意在必要时改变:如上所述,我只是在找工作的最佳工具.
谢谢 !
更新: 服务器端是我对此问题非常感兴趣的部分,而不是客户端.
看起来它可能是微不足道的,但是当你开始挖掘时,你会看到.NET的4 Mb限制,使用大量内存的下载,可以阻止其他线程(当你对线程数有限制时,如果一个线程可以通过互联网在2 Gb文件上传/下载期间执行:那么这不会很好地扩展,是吗?)等等.
在数据库导航器中,数据库不按字母顺序排序。
当服务器上有许多数据库时,使用起来会很痛苦。
我有一个Elapsed方法,我有一个while循环.如果从另一个线程禁用/停止计时器,我希望此循环停止.我可以依赖Elapsed方法中的计时器的Enabled属性,或者我应该创建一个"volatile bool timerEnabled"变量来确定.我的测试显示它没问题,但我想在投入生产之前确定这一点.
这是我想要实现的(不是实际的代码,而是关闭)
private volatile bool isElapsedAlreadyRunning
void myTimer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!isElapsedAlreadyRunning) // to prevent reentrance
{
isElapsedAlreadyRunning = true;
try
{
while (myTimer.Enabled && some other condition)
{
do stuff
}
}
finally
{
isElapsedAlreadyRunning = false;
}
}
}
myTimer.Start() and myTimer.Stop() are in other methods that can be called frrom other threads
Run Code Online (Sandbox Code Playgroud)
我正在使用System.Timers.Timer类
如果您对此设计有任何其他意见或看到任何陷阱,请随时评论:)
谢谢
编辑:
男人,线程很难.基于答案和其他stackoverflow问题(特别是这个答案),这将是这样做的方式(我希望这次没关系)
public class NoLockTimer : IDisposable
{
private readonly System.Timers.Timer _timer;
private bool _isTimerStopped = …Run Code Online (Sandbox Code Playgroud) 我正在编写可以更新文件的代码(多么罕见且令人兴奋!).当文件更新后,我需要Windows资源管理器再次调用覆盖扩展,以便我总是在文件上有正确的覆盖.我想我会用一些p/invoke技巧来做这件事(看看TortoiseSVN是如何做的),但我总是得到错误14007并且无法找到原因.这是代码:
IntPtr ptr = Marshal.StringToHGlobalUni(FullName);
Shell.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH | SHCNF_FLUSH, ptr, IntPtr.Zero);
Win32Exception w = new Win32Exception(Marshal.GetLastWin32Error());
LOG.ErrorFormat("Error {0} calling SHChangeNotify : {1}", w.NativeErrorCode, w.Message);
Marshal.FreeHGlobal(ptr)
Run Code Online (Sandbox Code Playgroud)
Fullname是已更新文件的路径.我收到以下错误:
Error 14007 calling SHChangeNotify : The requested lookup key was not found in any active activation context
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
仅供参考:
[DllImport("Shell32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2);
SHCNE_UPDATEITEM = 0x00002000
SHCNF_PATH = SHCNF_PATHW = 0x0005
SHCNF_FLUSH = 0x1000
Run Code Online (Sandbox Code Playgroud) c# ×4
java ×4
android ×2
spring-boot ×2
spring-cloud ×2
upload ×2
.net ×1
applet ×1
dbeaver ×1
file-upload ×1
firefox ×1
flash ×1
http ×1
inputstream ×1
javascript ×1
junit ×1
macos ×1
mariadb ×1
pinvoke ×1
rx-java ×1
shell32 ×1
shortcut ×1
silverlight ×1
spring ×1
timer ×1
transactions ×1
upgrade ×1
windows ×1
wix ×1
xamarin ×1