小编Séb*_*mer的帖子

从浏览器上传多个文件的最佳方式

我正在开发一个Web应用程序.用户可以使用HTTP协议上传文件.经典的HTML文件上传控件和用于上传文件的Java小程序之间有一个选择.

经典的HTML文件上传不是很好,因为你一次只能选择一个文件,而且在实际上传过程中很难获得任何进度指示(我最终使用定时器刷新了一个进度指示器,其中包含从中获取的数据)服务器通过AJAX调用).优点:它始终有效.

使用Java applet,我可以做更多的事情:一次选择多个文件(甚至是文件夹),压缩文件,获得真正的进度条,在applet上拖放文件等等......
但是有一些缺点:

  • 让它在Mac Safari和Mac Firefox上正常工作是一场噩梦(感谢Liveconnect)
  • 用户界面并不完全是原生用户界面,有些人会注意到这一点
  • 小程序没有应有的响应(可能是我的错,但一切看起来都不错)
  • UrlConnection使用HTTPS 的Java 类中存在错误,因此我使用Apache通用HTTP客户端来执行实际的HTTP上载.这是一个非常大的包,减慢了.jar文件的下载速度
  • Apache公共HTTP客户端有时会遇到代理问题
  • Java运行时非常大

我一直在维护这个Java applet但是现在我已经厌倦了所有的缺点,并考虑编写/购买一个全新的组件来上传这些文件.

如果您有以下要求:

  • 通过HTTP或HTTPS轻松地从浏览器上传多个文件
  • 压缩文件以减少上传时间
  • 上传应该可以在任何平台上使用本机UI
  • 必须能够上传大文件,至少2gb
  • 你对这项技术有全权委托

你会使用什么技术/组件?


编辑:

  • 拖放组件上的文件将是一个很好的加分.
  • 看起来有很多与Flash Player的错误有关的问题(swfupload已知问题).适当的Mac支持和通过身份验证的代理上传是我不能没有的选择.这可能会排除所有基于Flash的选项:-(.
  • 我排除了所有HTML/Javascript选项,因为您不能使用经典HTML控件一次选择多个文件.当您想要选择文件夹中的多个文件时,单击"浏览"按钮的n倍是很痛苦的.

java flash silverlight upload http

36
推荐指数
3
解决办法
3万
查看次数

Java Applet无法在Mac OS上的Firefox中与javascript通信吗?

我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望从这些函数中得到结果.这适用于以下配置:

  • IE浏览器
  • FireFox/Windows
  • Safari/Mac

但它不适用于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)

javascript java macos firefox applet

12
推荐指数
1
解决办法
9970
查看次数

C# - 如何检测Windows关闭/注销并取消该操作(在询问用户之后)

一些解释:对于我正在研究的项目,我必须编写一个在后台运行的程序,检测文件的更改,并将修改后的文件上传到Web服务,以便其他人可以使用.如果不是用户修改大文件并决定在编辑后立即关闭其计算机,则非常简单的同步.

我可以取消上传并等待下次重启以进行上传,但我可以想象用户第二天早上将文件从网络下载到另一台计算机,并且不明白为什么他昨晚的更改不存在.

所以我的想法是检测用户何时注销或重新启动Windows,如果我正在上传,只要询问用户"我们仍在同步Foo.txt您刚刚更改的文件.您确定要重新启动吗? ?在重新启动计算机之前,您的更改将无法用于其他人!" 如果用户拒绝,我需要取消重启/注销

这可能吗?

.net c# windows system-shutdown

9
推荐指数
1
解决办法
2万
查看次数

如何在处理动作发送意图的应用程序中获取通过EXTRA_STREAM接收的数据大小?

当另一个应用程序将文件发送到我的应用程序时,我通过该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"异常.

任何确定的火灾方式来获得我将获得的数据流的总大小?

android inputstream android-intent android-contentprovider

7
推荐指数
1
解决办法
1866
查看次数

使用Feign客户端RequestInterceptor转发请求标头或安全上下文

我想转发带有假装客户端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)

现在,如果没有必要,我不太热衷于更改这种默认值,是否有另一种推荐的转发标头现在的方式?

谢谢

spring-boot spring-cloud netflix-feign

7
推荐指数
1
解决办法
4857
查看次数

RxJava测试:如何等待所有后台任务完成

TLDR:我在RxJava Observables中进行后台处理,我正在进行集成测试,我希望能够独立等待该处理完成,以确保从一次测试开始的后台处理不会干扰另一个测试.


简化,我有一个@RequestMapping方法,可以执行以下操作:

  • 在数据库中插入数据
  • 启动对该数据的异步处理(通过Feign,db更新进行http调用)
  • 什么都不返回(HttpStatus.NO_CONTENT)

这种异步处理以前是用a完成的ThreadPoolTaskExecutor.我们将转换到RxJava并希望删除此ThreadPoolTask​​Executor并使用RxJava进行后台处理.

所以我试图这样做的时候非常天真:

Observable
    .defer(() -> Observable.just(call to long blocking method) 
    .subscribeOn(Schedulers.io())
    .subscribe();
Run Code Online (Sandbox Code Playgroud)

最终目标当然是,一步一步,进入"调用长阻塞方法"并一直使用Observable.

在此之前,我想首先使我的集成​​测试工作.我通过对映射执行RestTemplate调试来测试它.由于大多数工作是异步的,我的调用返回非常快.现在我想找到一种方法来等待异步处理完成(以确保它不与另一个测试冲突).

在RxJava之前,我只计算ThreadPoolTask​​Executor中的任务并等到它达到0.

我怎么能用RxJava做到这一点?


我尝试了什么:

  • 我尝试使用RxJavaSchedulersHook立即使我的所有调度程序立即生效:这导致某处某种阻塞,代码执行在我的Feign调用之前停止(Feign在引擎盖下使用RxJava)
  • 我尝试使用Rx RxJavaObservableExecutionHook计算任务:我尝试保留订阅,并在isSubcribed = false时删除它们,但这根本不起作用(许多订阅者,计数永远不会下降)
  • 我试图将一个observeOn(immediate())放在真正的生产代码中.这似乎有效,我可以为运行时/测试阶段注入正确的调度程序,但我并不真正热衷于在我的实际生产代码中将代码用于测试目的.

我可能非常错误,或者过于复杂的事情,所以不要犹豫,纠正我的理由!

java rx-java spring-boot spring-cloud

6
推荐指数
2
解决办法
2451
查看次数

模式进行wix升级而不会弄乱用户的桌面图标

我正在研究的Wix设置询问用户是否从桌面上的主程序安装shorcut.

问题是在升级过程中,删除了快捷方式,然后重新创建:

  • 如果用户移动了图标,则可能会在其他位置重新创建(从左上角开始的下一个可用空间)
  • 如果用户在初始安装期间选择不创建图标,则使用UI升级时不会记住默认情况下创建图标的复选框应"未选中",而静默升级只会创建图标,尽管用户明确选择不具有这个图标已创建.

有没有一种简单的方法来妥善处理这种情况?

以下是我的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

谢谢 !

wix upgrade shortcut desktop-shortcut

5
推荐指数
1
解决办法
517
查看次数

Mono.Data.Sqlite.SqliteConnection.SetConfig 抛出一个库使用错误异常

使用 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),结果相同。

这种方法真的有效吗?


编辑:我修复了我的源问题(那些讨厌的无限循环,我永远不会摆脱它......),所以不需要再为我玩线程配置了。

不过,我会将这个问题留给其他人,因为问题仍然存在,并且已被其他人试验过(参见对此答案的评论

c# android xamarin.android xamarin

5
推荐指数
1
解决办法
1930
查看次数

通过不使用 @Transactional 的 Spring 测试回滚对 MariaDB 数据库所做的更改

我有一个 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 junit spring transactions mariadb

5
推荐指数
1
解决办法
529
查看次数

在服务器端处理非常大的http上传和下载的最佳方法

我有一个即将到来的项目,我需要处理来自浏览器的非常大的上传(经典输入类型="文件"或Java小程序),并寻找在服务器上完成工作的最佳工具.

论文是我需要的东西:

  • 服务器上的内存消耗很低
  • 能够将文件保存在服务器上的最终目的地(不复制文件)
  • 没有阻止网络服务器完成的其他重要任务
  • 处理高达2 GB的文件
  • 文件授权(权限将在应用程序中给出)

我仍然对使用什么技术有一定的自由度,所以我想提出一些建议,以便能够选择服务器上的最佳技术来处理这项任务:

  • ASP.NET?
  • Java?
  • 亚马逊S3?
  • 其他选择?

我更习惯微软堆栈,但愿意在必要时改变:如上所述,我只是在找工作的最佳工具.

谢谢 !

更新: 服务器端是我对此问题非常感兴趣的部分,而不是客户端.

看起来它可能是微不足道的,但是当你开始挖掘时,你会看到.NET的4 Mb限制,使用大量内存的下载,可以阻止其他线程(当你对线程数有限制时,如果一个线程可以通过互联网在2 Gb文件上传/下载期间执行:那么这不会很好地扩展,是吗?)等等.

upload file-upload web-applications large-file-upload

4
推荐指数
1
解决办法
6952
查看次数

如何在 DBeaver 数据库导航器中按字母顺序对数据库进行排序

在数据库导航器中,数据库不按字母顺序排序。

当服务器上有许多数据库时,使用起来会很痛苦。

dbeaver

4
推荐指数
1
解决办法
3272
查看次数

System.Timers.Timer.Enabled属性是否安全,因此可以从计时器的Elapsed事件中访问它?

我有一个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)

c# multithreading timer thread-safety

3
推荐指数
1
解决办法
1924
查看次数

如何从C#调用SHChangeNotify,无错误14007

我正在编写可以更新文件的代码(多么罕见且令人兴奋!).当文件更新后,我需要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# pinvoke shell32

2
推荐指数
1
解决办法
2705
查看次数